VC.Net的托管与非托管混合编程

来源:互联网 发布:套筒扳手 淘宝 编辑:程序博客网 时间:2024/04/30 02:37

http://hi.baidu.com/guo_1017/item/67b9ea33a4db5025b2c0c514

VC.Net的托管与非托管混合编程

文章来源:卓锐精品之博 http://blog.elitehome.cn
作者:华珑

这几天一直研究VC.Net的托管与非托管混合编程

.Net作为一个非常优秀的开发平台,能让开发人员快速开发界面与应用,但.Net托管代码是可以很轻易的反编译,给开发者带来了很多麻烦。而 VC.Net的非托管代码可以有效防止反编译,至少不是那么容易反编译。VC.Net的一个非常有用的开发方式,就是托管代码和非托管代码的混合开发。


C#作为一种新型的纯托管的开发语言,在使用上,有极其简单的学习过程,让学习者能很快掌握与使用。因此,我们的混合编程,可使用C#开发的DLL,在VC.Net中可以方便被引用。

VC.Net中的混合编程,最困难的并不是VC++的语言难懂复杂,而是托管与非托管之间的数据转换。

目前寻找到一种相对比较简单可靠的方式:

使用cli::array来做中间体转换。

cli::array可同时在托管与非托管代码中使用,并可方便将非托管的char数组类型变成cli::array类型,并通过托管的System::Text::UTF8Encoding转换成托管的String^类型。
由于非托管的数据类型大都能转换成char数组,而cli::array类型实际就是托管代码中的byte[]类型,因此也可以方便转换成各种托管的数据类型。

具体的例子如下:

  1. String^ ConvertToString(char* inChar, int Len)
  2. {
  3. cli::array<unsigned char>^ cli_array = gcnew cli::array<unsigned char>(Len);
  4. for(int i=0;i < Len;i++)
  5. cli_array[i] = inChar[i];
  6. System::Text::UTF8Encoding ^ encoding=gcnew System::Text::UTF8Encoding();
  7. return encoding->GetString(cli_array);
  8. }
  9. char * ConvertToChar(String^ inString)
  10. {
  11. int Len = _inString->Length;
  12. cli::array<unsigned char>^ cli_array = gcnew cli::array<unsigned char>(Len);
  13. System::Text::UTF8Encoding ^ encoding=gcnew System::Text::UTF8Encoding();
  14. encoding->GetBytes(inString,0,Len,cli_array,0);
  15. char* outChar=new char[Len];
  16. for(int i=0;i<Len;i++)
  17. outChar[i]=cli_array[i];
  18. return outChar
  19. }

在VC.Net中,用nullptr来代替null。

原创粉丝点击