ICLRRuntimeHost Start方法永远不会返回

时间:2016-01-07 20:38:41

标签: c# c++ .net clr

我正在将非托管DLL注入另一个非托管进程。这里的目标是使用此引导程序初始化CLR,以便我可以在目标进程中使用.NET框架。注入工作正常,但是尝试启动CLR并加载我的托管库会导致问题。这是我的代码我试图启动CLR(从DLLMain调用右键):

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 个答案:

答案 0 :(得分:1)

  

我正在尝试启动CLR(从DLLMain调用右键)

您无法从DllMain内启动CLR。 DllMain是一个非常敌对的地方,你基本上不能做很多事情,而不会因代码在DllMain内运行时保持(全局)加载程序锁而出现问题。在您的示例中,最有可能的是,ICLRRuntimeHost.Start()尝试执行某些操作,这些操作也会锁定此加载程序锁,从而阻塞(死锁)。你应该能够通过调试器看到它​​。

Raymond Chen(oldnewthing)撰写了几篇关于此问题及相关问题的博客文章,例如this一篇。