我正在将非托管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()并尝试立即执行会产生相同的结果。
答案 0 :(得分:1)
我正在尝试启动CLR(从DLLMain调用右键)
您无法从DllMain
内启动CLR。 DllMain
是一个非常敌对的地方,你基本上不能做很多事情,而不会因代码在DllMain
内运行时保持(全局)加载程序锁而出现问题。在您的示例中,最有可能的是,ICLRRuntimeHost.Start()
尝试执行某些操作,这些操作也会锁定此加载程序锁,从而阻塞(死锁)。你应该能够通过调试器看到它。
Raymond Chen(oldnewthing)撰写了几篇关于此问题及相关问题的博客文章,例如this一篇。