http://blog.csdn.net/Muf/article/details/656920html
转向.NET后,手头上每每仍有旧的模块要重用。也许这些模块是Delphi写的,也许是C/C++写的,或者是其它编程语言……为了能把它们移植到.NET下,或者是在.NET中调用,To be or not to be, that is a question。
在这里,我笔记了几个在工做中遇到的几个场景。不过,这里不包括彻底使用C#来重写原来用C++编写的程序这种变态的需求。当你被要求作这种事的时候,请三思然后行……这简直是种非人的折磨。
您也使用托管C++吗? 如沐枫林
场景一:在.NET中调用WindowsAPI或DLL。
这是比较广泛的需求。通常来讲,简单的函数调用,大可直接用C#/VB.NET,通过DllImport属性包装出函数来调用。如:ios
因为WindowsAPI用到的人实在是多,所以有一个专门的wiki站点,收集这方面的资料:http://www.pinvoke.net/,对于经常使用的函数甚至有完整的应用例子和帮助。固然,若是你有相应的资料和例子,你也能够贡献你的力量,给其它人帮助。
场景二:用托管C++包装现有的DLL,供C#调用
当函数的参数或返回值比较复杂,或函数比较多的时候,这种方法对与人来讲,实在是一个折磨。经常这些接口和定义就要用掉几千行的代码,并且还不能保证是正确的。这些错误每每在运行时才能显现出来,甚至有些错误会引发内存泄漏,或其它更为隐蔽的错误。
在这种状况下,使用C++/Managed代码来包装,就成了最合理的选择。由于托管C++代码能够直接引用原有的头文件,直接调用非托管函数,而不须要声明。这样,既减小了工做量,又避免引入错误。缺点是,这种方法会增长一个DLL。要注意的是托管字符串和非托管字符串是有区别的,并须要转换(特别要注意的Unicode字符串和多字节字符串的转换)。
仍以MoveFile为例吧,这样比较简单:
c++
而后在C#中,引用上面代码生成的DLL文件,就能够直接调用了:编程
假如原有的代码是基于COM的,那么太好了,VisualStudio等IDE会自动生成一个用于包装的dll,供你调用。固然因特殊须要而手工编码的是另外一回事。
场景三:现有C++原代码,包装后供C#调用。
C++的原代码,实际上能够直接编译成托管代码。MFC也好ATL也好……这样看起来在.NET中最强大的编程语言就是C++了:它不只能够编写托管程 序,甚至能够将标准C++的代码也编译成托管程序!其实VC++最强大的地方不止如此,它还在于可以编写混合了托管和非托管的代码的程序!!!这样最大的 好处不只能够将关键代码直接编译成非托管的代码,还能够避免被反编译。
假设现有C++代码以下:windows
咱们只要再增长一个包装类到工程文件中:app
而后,改变编译选项为“使用公共语言扩展 /clr”就能够了。这样,咱们把代码编译成DLL文件就能够供.NET其它语言调用了。
最后,C#中能够象以下的代码同样调用C++类了:编程语言
场景四:如何在托管C++代码中混合托管和非托管代码
很简单,只要从#pragma unmanaged编译指示开始的程序,一率编译成非托管代码;要想恢复成托管代码,只要使用#pragma managed就能够了。如:
函数
生成exe文件后,用反编译程序查看 f 函数:post
看不到源码,而方法属性标记为Unmanaged。
若是没有加上#pragma unmanaged,反编译获得的 f 函数为:测试
其中的函数内容一目了然。若是你的函数没有调用operator等很差理解的类库,那么反编译出来的代码简直和源码没差异。
场景五:不想要DLL,能不能直接把C++源代码与C#源代码一块儿编译成一个单独的Assembly呢?
固然是能够的。具体参见:让C++源码和C#源码一块儿生成单一的Assembly
开心一刻:我只会C++不懂.NET不懂C#,怎么编写.NET程序?
很简单,你照样用你的C++写你的程序,而后测试没有错误后,将编译选项改成/clr,好了,Rebuild,你的程序如今是.NET了。
恶搞:“我想问一下,在能将现有的C++代码直接进行封装,被C#进行调用,而不是去调用DLL,也就是不生成DLL,就在C#下能直接调用VC的工程源文件不?” 我想,提问的人是否是指,现有c++源码,但不想费劲去转换成C#源码,但又想能与C#一块儿编译。 因而我就给了一个极其变态的方法,不过,我的是不建议使用这种变态的方法啊。方法以下: 1 先将C++源码,改用CLR编译选项,编译成.NET的Assembly(DLL文件)。 2 而后用reflector等反编译软件,反编译成C#代码,并导出(reflector有专门的导出插件)。 3 将导出的C#代码,添加上新写的C#代码一块儿编译。 这种方法生成的代码非常恐怖,强烈建议不要把C++源码就这么丢了,不然后果自负。-------部份例子来自MSDN.