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 一篇。
我正在将一个非托管 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 一篇。