!!!您也使用托管C++吗?--此文能解决大部分问题
2010-05-04 10:32
549 查看
http://hi.baidu.com/wch20088082008/blog/item/21acb7444fc6b02fcffca386.html
您也使用托管C++吗?
2009年07月01日 星期三 22:05
您也使用托管C++吗?
2009年07月01日 星期三 22:05
【摘要】转向.NET后,手头上往往仍有旧的模块要重用。也许这些模块是Delphi写的,也许是C/C++写的,或者是其它编程语言……为了能把它们移植到.NET下,或者是在.NET中调用,To be or not to be, that is a question. 在这里,我笔记了几个在工作中遇到的几个场景。不过,这里不包括完全使用C#来重写原来用C++编写的程序这种变态的需求。当你被要求做这种事的时候,请三思而后行……这简直是种非人的折磨。 场景一:在.NET中调用WindowsAPI或DLL. 这是比较普遍的需求。一般来说,简单的函数调用,大可直接用C#/VB.NET,经过DllImport属性包装出函数来调用。如:
场景二:用托管C++包装现有的DLL,供C#调用 当函数的参数或返回值比较复杂,或函数比较多的时候,这种方法对与人来说,实在是一个折磨。常常这些接口和定义就要用掉几千行的代码,而且还不能保证是正确的。这些错误往往在运行时才能显现出来,甚至有些错误会引起内存泄漏,或其它更为隐蔽的错误。 在这种情况下,使用C++/Managed代码来包装,就成了最合理的选择。因为托管C++代码可以直接引用原有的头文件,直接调用非托管函数,而不需要声明。这样,既减少了工作量,又避免引入错误。缺点是,这种方法会增加一个DLL.要注意的是托管字符串和非托管字符串是有区别的,并需要转换(特别要注意的Unicode字符串和多字节字符串的转换)。 仍以MoveFile为例吧,这样比较简单:
wrapper.ApiWrapper.MoveFile(@"c:/debug.log", @"c:/debug.txt"); 假如原有的代码是基于COM的,那么太好了,VisualStudio等IDE会自动生成一个用于包装的dll,供你调用。当然因特殊需要而手工编码的是另一回事。 场景三:现有C++原代码,包装后供C#调用。 C++的原代码,实际上可以直接编译成托管代码。MFC也好ATL也好……这样看起来在。NET中最强大的编程语言就是C++了:它不仅可以编写托管程序,甚至可以将标准C++的代码也编译成托管程序!其实VC++最强大的地方不止如此,它还在于能够编写混合了托管和非托管的代码的程序!!!这样最大的好处不仅可以将关键代码直接编译成非托管的代码,还可以避免被反编译。 假设现有C++代码如下:
最后,C#中可以象如下的代码一样调用C++类了:
很简单,只要从#pragma unmanaged编译指示开始的程序,一率编译成非托管代码;要想恢复成托管代码,只要使用#pragma managed就可以了。如:
[PreserveSig, MethodImpl(MethodImplOptions.Unmanaged, MethodCodeType=MethodCodeType.Native), SuppressUnmanagedCodeSecurity] public static unsafe void modopt(CallConvCdecl) f<char const *>(sbyte modopt(IsSignUnspecifiedByte) modopt(IsConst)*); 看不到源码,而方法属性标记为Unmanaged. 如果没有加上#pragma unmanaged,反编译得到的 f 函数为:
开心一刻:我只会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++源码就这么丢了,否则后果自负。 场景五:不想要DLL,能不能直接把C++源代码与C#源代码一起编译成一个单独的Assembly呢? 当然是可以的。 |
相关文章推荐
- !!!您也使用托管C++吗?--此文能解决大部分问题
- 【问题解决】在C#中使用C++编写的类 使用托管c++(managed c++)
- 巧妙使用offsetof宏定义,在c,c++开发中解决问题
- linux Eclipse上c++调用使用了tensorflow库的python程序遇到的问题及解决方法
- C++与Java使用SOCKET通信遇到的一种阻塞问题的解决
- 使用Eclipse集成SDK时C++遇到的问题及解决
- C++ SQLite安装与使用,以及一个问题解决
- 【Web】C++ Http -- 记一次使用第三方http请求的问题解决
- 使用C++调用Python脚本的步骤和问题解决办法
- 解决页面中文的乱码问题,使用过滤器为所有页面配置编码格式,解决大部分的中文乱码问题
- C++ 使用蚁群算法解决TSP问题 续
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- c++------用结构体以及栈的使用来解决迷宫问题
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 非托管C++调用 Webservice,如何解决状态保持的问题
- c++ 使用蚁群算法解决TSP问题。
- 遗传算法解决TSP问题c++ 可使用(找不到出处了)
- 关于安装linux redhat后无法使用yum命令安装gcc-c++问题的解决过程
- c++ 使用pbc 解决lua 解析protobuf 问题
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法