ICLRuntimeHost Start方法永远不会返回
本文关键字:返回 永远 Start 方法 ICLRuntimeHost | 更新日期: 2023-09-27 18:29:21
我正在将非托管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(旧事物)已经写了几篇关于这个和相关问题的博客文章,例如这篇。