2016-01-07 67 views
-1

我正在向非託管進程注入非託管DLL。這裏的目標是使用這個引導程序來初始化CLR,這樣我就可以在目標進程中使用.NET框架。注入工作正常,但試圖啓動CLR並加載託管庫會導致我遇到問題。這裏是我的代碼,我試圖啓動與CLR(右來自調用DllMain):)ICLRRuntimeHost啓動方法永不返回

void Init() { 
    ICLRRuntimeHost *pClrHost = NULL; 
    HRESULT hr = CorBindToRuntimeEx(NULL, L"wks", 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID*)&pClrHost); 

    MessageBox(NULL, L"attempt start", L"Dll", MB_OK); 
    hr = pClrHost->Start(); 
    MessageBox(NULL, L"past start", L"Dll", MB_OK); 

    DWORD dwRet = 0; 
    hr = pClrHost->ExecuteInDefaultAppDomain(L"C:\\Users\\Blank\\Documents\\ManagedLibrary.dll", L"Namespace.Class", L"Main", L"Parameters", &dwRet); 
} 

我的第一個消息框彈出罰款,但調用Start(似乎要禁止,再也不回來。這會導致目標進程無響應。註釋掉Start()並嘗試立即執行具有相同的結果。

回答

1

我試圖啓動與CLR(從右側的DLLMain調用)

您不能啓動從內部DllMain的CLR。 DllMain是一個非常敵對的地方,你基本上不能做很多事情,沒有因爲(代碼在DllMain內運行)時保持(全局)加載程序鎖定的事實而出現問題。在你的例子中,最有可能的是,ICLRRuntimeHost.Start()試圖做一些事情,也想鎖定這個加載器鎖,從而阻塞(死鎖)。你應該能夠通過調試器看到。

Raymond Chen(oldnewthing)撰寫了一些關於此問題和相關問題的博文,例如this之一。

+0

然後,如果我不能在DLLMain中執行,我該如何開始CLR呢?我正在注入一個完全獨立的進程,所以我不能使用PInvoke來調用其他一些方法。 – AnthonyOSX

+0

我相信還有其他與SO有關的問題。我在這裏不是專家,但你可以嘗試注入一個遠程線程('CreateRemoteThread')並從那裏啓動它。 –