关于.NET和Win32联合编程的小结
acmilan2016/07/08软件综合 IP:四川

.NET和Win32联合编程大概有以下几个途径:

  1. 使用C#的DllImport直接引入WinAPI(少量方便,大量麻烦,但是可以用Any CPU编译)
  2. 使用C++编写Win32DLL供C#调用(比较方便,但限制很多,不能用Any CPU,但是不受编译器限制)
  3. 使用C++/CLI编写类库供C#调用(方便,但是不能用Any CPU,受编译器限制,.NET2.0/3.x必须使用VC++2005/2008编译)
  4. 使用C++调用.NET非托管接口(非常麻烦,难度极高,而且限制很多,不能用Any CPU,但是不受编译器限制)

编写COM组件互相调用之类的麻烦方法就不说了

个人推荐的做法如下——

想要使用Any CPU,或者WinAPI调用较少易于管理:

  1. 只能使用C#的DllImport直接引入WinAPI

不需要使用Any CPU,WinAPI调用较多,对于.NET3.5程序:

  1. 能用VC++2005/2008,直接使用C++/CLI编写类库供C#调用
  2. 不用VC++2005/2008,使用C++编写Win32DLL供C#调用

不需要使用Any CPU,WinAPI调用较多,对于.NET4.0程序:

  1. 直接使用C++/CLI编写类库供C#调用

不推荐使用.NET非托管接口,得不偿失。

关于.NET 3.5/4.0断层——

.NET 2.0/3.x程序如果想运行在4.0以上版本,必须添加XXXXXXXXXXnfig配置文件指定.NET版本:

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

.NET 4.x程序无法运行在2.0/3.x或更低版本下。

新版VS可以编译.NET 2.0/3.x的C#程序程序,是因为.NET 2.0/3.5自带C#2.0和C#3.0编译器,VS会调用它们进行编译。

相比而言,C++/CLI就麻烦多了,因为.NET并不自带VC++2005或VC++2008编译器,而新版编译器编译的程序只兼容.NET4.x,因此如果需要编译.NET 2.0/3.x程序的话,需要自备编译器。

[修改于 8年5个月前 - 2016/07/08 02:25:25]

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

一旦调用了自己写的C++代码,就不能保证使用Any CPU,因为系统的WOW64重定向只针对系统文件和Program Files文件夹,静态引用程序集和DllImport也并没有机会让你手动重定向。同时,动态加载太麻烦,得不偿失。

32位(x86/Win32)对于一般应用来说是足够的,并且某些插件只有32位,因此如果使用了任何C++程序,或任何只有32位的插件,要把C#架构改为32位(x86)。

建议在64位系统下编写程序。如果在32位下编写,可能不容易发现Any CPU在64位系统中会引发异常,这种情况下,在任何时候都将C#的架构改为32位(x86)是一个良好的做法。

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

新版Visual Studio会根据引用的程序集有没有32位来决定C#程序的执行位数,也就是说,如果Any CPU引用了32位程序集,那么就会按32位编译主程序。不过,为了兼容性起见,应该总是选择x86架构。

引用
评论
加载评论中,请稍候...
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)}}