文章来源:卓锐精品之博 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[]类型,因此也可以方便转换成各种托管的数据类型。
具体的例子如下:
- String^ ConvertToString(char* inChar, int Len)
- {
- cli::array<unsigned char>^ cli_array = gcnew cli::array<unsigned char>(Len);
- for(int i=0;i < Len;i++)
- cli_array[i] = inChar[i];
- System::Text::UTF8Encoding ^ encoding=gcnew System::Text::UTF8Encoding();
- return encoding->GetString(cli_array);
- }
- char * ConvertToChar(String^ inString)
- {
- int Len = _inString->Length;
- cli::array<unsigned char>^ cli_array = gcnew cli::array<unsigned char>(Len);
- System::Text::UTF8Encoding ^ encoding=gcnew System::Text::UTF8Encoding();
- encoding->GetBytes(inString,0,Len,cli_array,0);
- char* outChar=new char[Len];
- for(int i=0;i<Len;i++)
- outChar[i]=cli_array[i];
- return outChar
- }
在VC.Net中,用nullptr来代替null。