2011-05-24 81 views
3

正如標題所說,我想從非託管代碼調用混合模式程序集。從非託管代碼加載混合模式程序集

更確切地說,我想動態加載混合模式程序集,然後執行一些靜態的非託管啓動代碼,爲C#代碼註冊一些託管C++包裝程序。

這是可能的(或者我需要嵌入.Net運行時或使用COM?)?

有沒有人已經做到了這一點,可以分享一些經驗?

PS:如果混合模式程序集包含WPF窗口,它會啓動嗎?

回答

2

你需要獲得CLR的加載和初始化。是的,製作託管類[ComVisible]或使用CorBindToRuntimeEx()自行託管CLR是實現此目的的一種方法。一個非常簡單的方法是從你的DLL中導出一個託管函數,C++/CLI編譯器在代碼中嵌入一個thunk來處理初始化CLR。很容易做到,但當您的託管代碼接口很胖時,它不能很好地擴展。

ref class Bootstrap 
{ 
public: 
    static void Initialize() { 
     // etc.. 
    } 
}; 

extern "C" __declspec(dllexport) 
void __stdcall LoadAndInitialize() 
{ 
    Bootstrap::Initialize(); 
} 

您可以通過將函數指針傳遞給您的本機接口來進行修飾。使用Marshal :: GetDelegateForFunctionPointer()將其轉換爲託管代理。如果你這樣做,不要忘記用#pragma管理任何本地聲明。

+0

如果我不導出符號並執行一些靜態設置代碼(註冊本機回調),CLR是否也會被初始化? – sanosdole 2011-05-24 13:35:44

+0

不,C++/CLI編譯器生成的用於支持託管函數的__declspec(dllexport)的thunk必不可少。 – 2011-05-24 15:29:37