文号
822429
阅读
6104
回复
2
收藏
1
关于.NET和Win32联合编程的小结
2016/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以上版本,必须添加xxx.exe.config配置文件指定.NET版本:

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

.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程序的话,需要自备编译器。

[ 修改于10年5个月前 - 2016/07/08 02:25:25 ]
acmilan作者
10年5个月前修改于 10年5个月前IP:四川
822483
1楼

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

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

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

引用
评论
acmilan作者
10年5个月前修改于 10年5个月前IP:四川
822546
2楼
说明

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

引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的