ICLRuntimeHost Start方法永远不会返回

ICLRRuntimeHost Start method never returns

本文关键字:返回 永远 Start 方法 ICLRuntimeHost      更新时间:2023-10-16

我正在将非托管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()并尝试立即执行会得到相同的结果。

我正试图用(从DLLMain调用)启动CLR

不能从DllMain内部启动CLR。DllMain是一个非常敌对的地方,在这里你基本上不能做很多事情,而不会遇到问题,因为当代码在DllMain中运行时,(全局)加载程序锁被持有。在您的示例中,最有可能的是,ICLRRuntimeHost.Start()试图做一些同样想要锁定此加载程序锁的事情,从而阻止(死锁)。您应该能够通过调试器看到这一点。

RaymondChen(旧事物)已经写了几篇关于这个和相关问题的博客文章,例如这篇。