.NET和Win32联合编程大概有以下几个途径:
- 使用C#的DllImport直接引入WinAPI(少量方便,大量麻烦,但是可以用Any CPU编译)
- 使用C++编写Win32DLL供C#调用(比较方便,但限制很多,不能用Any CPU,但是不受编译器限制)
- 使用C++/CLI编写类库供C#调用(方便,但是不能用Any CPU,受编译器限制,.NET2.0/3.x必须使用VC++2005/2008编译)
- 使用C++调用.NET非托管接口(非常麻烦,难度极高,而且限制很多,不能用Any CPU,但是不受编译器限制)
编写COM组件互相调用之类的麻烦方法就不说了
个人推荐的做法如下——
想要使用Any CPU,或者WinAPI调用较少易于管理:
- 只能使用C#的DllImport直接引入WinAPI
不需要使用Any CPU,WinAPI调用较多,对于.NET3.5程序:
- 能用VC++2005/2008,直接使用C++/CLI编写类库供C#调用
- 不用VC++2005/2008,使用C++编写Win32DLL供C#调用
不需要使用Any CPU,WinAPI调用较多,对于.NET4.0程序:
- 直接使用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程序的话,需要自备编译器。
200字以内,仅用于支线交流,主线讨论请采用回复功能。