〖环境配置〗新版本VS编译C++/CLI 3.5的方法
acmilan2016/12/20软件综合 IP:四川

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

C++/CLI 3.5比4.0好用,它有两个好处,一是Win7可以免库运行,Win8以上配置XXXXXXnfig后也可以免库运行,二是不需要附带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

XXXXXXXXXXXXXXXXXXXXXXXXX/en-us/download/XXXXXXXXXXpx?id=8442

Windows SDK 7.0

XXXXXXXXXXXXXXXXXXXXXXXXX/en-us/download/XXXXXXXXXXpx?id=18950

[修改于 7年11个月前 - 2017/01/11 22:45:35]

来自:计算机科学 / 软件综合
2
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
acmilan 作者
8年0个月前 修改于 7年11个月前 IP:四川
828688

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

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

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

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

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

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年0个月前 修改于 8年0个月前 IP:四川
828692

C++/CLI语法简介

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

<code class="language-cpp">MyRefClass ^obj = gcnew MyRefClass();
obj->MyMethod();
delete obj; // 相当于C++中的obj.Dispose();
</code>

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

<code class="language-cpp">MyValueClass struct1;
struct1.MyMethod();
</code>

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

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

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

<code class="language-cpp">int val = 2;
printf("%p\n", (int *)&val);
</code>

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

<code class="language-cpp">#include <vcclr.h> // PtrToStringChars

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

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

<code class="language-cpp">wchar_t cstr[] = L"这是一个C语言宽字符串";
String ^str = gcnew String(cstr);
</code>
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年10个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}