免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

managed和unmanaged code的資料交換

在 Runtime 控制之下執行的程式碼稱為 Managed 程式碼。反之,在執行階段以外執行的程式碼就稱為 Unmanaged 程式碼。COM 元件、ActiveX 介面及 Win32 API 函式都是 Unmanaged 程式碼的範例。


-------------------------------------------------------------------------------
可以把兩種code寫在一起

#pragma managed
managedHello(){
Console::Out::Write("Hello");
}

#pragma unmanaged
unmanagedHello(){
std::cout<<"Hello";
}
-------------------------------------------------------------------------
原文連結
在做project的時候由於用到公司別組用C++寫的unmanged程式,免不了得做unmanaged和mamanged的資料交換。C#由於是在.NET架構之下(一般稱為managed code,不在.NET下的程式則稱為unmanged/native code),.NET的資料型別和C++並不相同,尤其是自訂和指標相關物件,如果不額外做點事情,二邊資料彼此是看不懂的,Compiler馬上會抱怨不知道該怎麼辦。要做資料交換,MSDN給三條路:P/Invoke,COM marshaling和C++ marshaling。

P/Invoke和COM marshaling基本上是把native code包成動態程式庫或是COM物件供managed code叫用。效率如何,微軟只說P/Invoke會比COM marshaling好點(additional 10 instructions vs. 50 instructions per data exchange),和全都是managed code比起來慢不少就是了。C++/CLI(早期叫managed C++)算是比較理想的一種做法,Visual Studio會把用C++/CLI寫的程式編成.NET讀得懂的東西(MSIL,C#也是編譯成這個intemediate language),但是在C++/CLI裡面可以直接使用native code寫的物件類別,這個設計提供一個漂亮的資料交換管道,效率也是最好的。只不過要多寫一些程式「騙」.NET說native的資料物件是managed。
返回列表