2009-04-21 62 views
1

我正在探索從調用託管C .NET方法++代碼時,發現在How To Inject a Managed .NET Assembly (DLL) Into Another Process如何通過C++ DLL調用

void StartTheDotNetRuntime() 
{ 
    // Bind to the CLR runtime.. 
    ICLRRuntimeHost *pClrHost = NULL; 
    HRESULT hr = CorBindToRuntimeEx(
     NULL, L"wks", 0, CLSID_CLRRuntimeHost, 
     IID_ICLRRuntimeHost, (PVOID*)&pClrHost); 

    // Push the CLR start button 
    hr = pClrHost->Start(); 

    // Okay, the CLR is up and running in this (previously native) process. 
    // Now call a method on our managed class library. 
    DWORD dwRet = 0; 
    hr = pClrHost->ExecuteInDefaultAppDomain(
     L"c:\\PathToYourManagedAssembly\\MyManagedAssembly.dll", 
     L"MyNamespace.MyClass", L"MyMethod", L"MyParameter", &dwRet); 

    // Stop the CLR runtime 
    hr = pClrHost->Stop(); 

    // Don't forget to clean up. 
    pClrHost->Release(); 
} 

這工作沒有任何問題下面的函數調用一次在時分割點網主機功能控制檯應用程序。

我現在想要一個DLL中拆分此功能的使用,在邏輯上這應該是三個部分

Method - DLLMain 
    DLL_PROCESS_ATTACH 
     Bind to the CLR runtime 
     Push the CLR start button 

    DLL_PROCESS_DETACH 
     Stop the CLR runtime 
     Do not forget to clean up. 

Method - CallDotNetToDoSomething 

如何以及在哪裏我宣佈ICLRRuntimeHost pClrHost/HRESULT小時才能實現這一目標?

回答

1

他們應該可能是全局(靜態)變量,或者是某種單身人士。每個進程只允許一個.NET運行時(至少現在這個時候),所以沒有什麼意義可以嘗試比這更聰明。在DLL加載中填充全局變量,然後在DLL卸載期間將它們刪除。我創建了一個對象,它的構造函數啓動了運行時(即bind/push開始按鈕),並且其析構函數關閉了它(停止/釋放)。這樣主應用程序可以選擇如何操作,即將其放在main()的堆棧中,或者在DLL加載期間執行new(),並在DLL卸載時刪除。在這種情況下,您提到的指針將是您創建的新對象的實例變量,例如ClrEmbedManager。如果您的庫不需要在具有不同行爲的不同類型的應用程序中重用,那就太過分了。

+0

值得注意的是,從.NET 3.5開始,您現在可以在一個進程(並行)中擁有多個.NET運行時。不知道這是如何影響原始海報的問題。 – 2012-02-07 05:44:36