ICLRRuntimeHost 从不启动方法 returns

ICLRRuntimeHost Start method never returns

我正在将一个非托管 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() 似乎会阻塞并且永远不会 return。这会导致目标进程变得无响应。注释掉 Start() 并尝试立即执行具有相同的结果。

I'm attempting to start the CLR with (called right from DLLMain)

您不能从 DllMain 内部启动 CLR。 DllMain 是一个非常有敌意的地方,在那里你基本上不能做很多事情,而不会因为代码在 DllMain 中运行时持有(全局)加载程序锁而不会出现问题。在您的示例中,ICLRRuntimeHost.Start() 很可能会尝试做一些也想锁定此加载程序锁并因此阻塞(死锁)的事情。您应该能够使用调试器看到它​​。

Raymond Chen (oldnewthing) 写了几篇关于这个和相关问题的博文,例如 this 一篇。