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[]類型,因此也可以方便轉換成各種託管的數據類型。
具體的例子如下:
- 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。