文号
828683
阅读
7777
回复
2
收藏
1
〖环境配置〗新版本VS编译C++/CLI 3.5的方法
2016/12/20
IP:四川

使用C++/CLI的好处主要是可以将平台调用直接编译为程序集,不需要使用低级的C语言来组织模块,而一般的DllImport方法只能调用C函数,效率比较低下。

C++/CLI 3.5比4.0好用,它有两个好处,一是Win7可以免库运行,Win8以上配置app.config后也可以免库运行,二是不需要附带DLL,4.0还要附带msvcr1xx.dll和msvcp1xx.dll。

VS2008支持编译C++/CLI 3.5,但是功能比较差。VS2010只需要装Windows SDK 7.0就能编译C++/CLI 3.5,但是VS2010不支持C++/CLI智能提示。建议使用VS2012以上版本配合Windows SDK 7.0+7.1编译C++/CLI 3.5。

安装配置步骤

首先在【程序和功能】临时卸载【Microsoft Visual C++ 2010 x86/x64 Redistributable】不然接下来可能会安装失败。

新版本VS编译VC++2008/2010需要安装:

  • Windows SDK 7.1(必选,安装VC2008的MSBuild配置文件)
  • Windows SDK 7.0(必选,安装VC2008SP1编译器)

然后修改PATH环境变量,以避免产生找不到DLL的错误,修改为

32位系统:C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;原有内容

64位系统:C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE;原有内容

修改方法如图:

Windows 7-2016-12-20-18-35-53.png

然后就可以在项目属性中选择v90工具集了。如果遇到工程需要v90工具集的,可以尝试安装以上内容。

Windows 7-2016-12-20-20-33-52.png

编译成功:

Windows 7-2016-12-20-20-36-39.png

下载地址

Windows SDK 7.1

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Windows SDK 7.0

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

[ 修改于9年11个月前 - 2017/01/11 22:45:35 ]
acmilan作者
10年0个月前修改于 9年11个月前IP:四川
828688
1楼

在程序中引用C++/CLI 3.5类库

如果需要在C#中使用C++/CLI 3.5类库,需要添加App.config应用程序配置文件:

<?xml version="1.0"?>
<configuration>
  
  <startup uselegacyv2runtimeactivationpolicy="true">
    <supportedruntime version="v4.0.30319">
    <supportedruntime version="v2.0.50727">
  </supportedruntime></supportedruntime></startup>
</configuration>

另外还需要注意,C#目标平台应该设置为x86,默认的Any CPU不适用于混合程序,否则在64位系统上会产生错误。

如果需要让单独的C++/CLI程序运行在.NET 4.0以上版本,需要自行将App.config复制为与可执行文件同名的.exe.config文件,Visual Studio不会自动复制。

引用
评论
acmilan作者
10年0个月前修改于 9年11个月前IP:四川
828692
2楼

C++/CLI语法简介

ref class:相当于C#中的class,需要通过MyRefClass ^和gcnew、delete使用。

MyRefClass ^obj = gcnew MyRefClass();
obj->MyMethod();
delete obj; // 相当于C++中的obj.Dispose();

value class:相当于C#中的struct,可以直接声明MyValueClass变量来使用。

MyValueClass struct1;
struct1.MyMethod();

无论是ref class还是value class,它们的成员字段&取地址后都是interior_ptr<T>内部指针,需要使用pin_ptr<T>固定以后才能转换为T*普通指针。

pin_ptr<int> ptr = &this->a;
printf("%p\n", (int *)ptr);
</int>

堆栈上的变量直接&取地址就可以获得T*普通指针。

int val = 2;
printf("%p\n", (int *)&val);

String ^转换成const wchar_t *,使用PtrToStringChars和pin_ptr<const wchar_t>。

#include <vcclr.h> // PtrToStringChars

pin_ptr<const wchar_t> pinstr = PtrToStringChars(str);
MessageBox(NULL, (const wchar_t *)pinstr, L"消息框标题", MB_OK);
</const></vcclr.h>

const wchar_t *转换成String ^,直接使用String类的构造函数即可。

wchar_t cstr[] = L"这是一个C语言宽字符串";
String ^str = gcnew String(cstr);
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的