ICLRuntimeHost Start方法永远不会返回
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()似乎被阻止了,再也回不来了。这会导致目标进程变得没有响应。注释掉Start()并尝试立即执行会得到相同的结果。
我正试图用(从DLLMain调用)启动CLR
不能从DllMain
内部启动CLR。DllMain
是一个非常敌对的地方,在这里你基本上不能做很多事情,而不会遇到问题,因为当代码在DllMain
中运行时,(全局)加载程序锁被持有。在您的示例中,最有可能的是,ICLRRuntimeHost.Start()
试图做一些同样想要锁定此加载程序锁的事情,从而阻止(死锁)。您应该能够通过调试器看到这一点。
RaymondChen(旧事物)已经写了几篇关于这个和相关问题的博客文章,例如这篇。
相关文章:
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- cudaMemcpyToSymbol只是挂起,永远不会返回.GPU 处理速度为 100%.代码在 K40 上工作正常,但
- 无法从串行端口读取.WaitCommEvent() 永远不会返回
- 程序返回-1073741571而不是永远进行的值
- OpenRAVE ControllerBase 在 IsDone() 方法处阻塞并且永远不会返回
- LoadLibrary 永远不会在 Visual Studio 2013 c++ 项目中返回
- 如果发送进程停止,boost::interprocess::timed_received()永远不会返回
- CoCreateInstance() 永远不会返回
- 为什么这个对isspace()的调用永远不会返回true
- 对 Boost JSON 解析器的调用永远不会返回
- 为什么 ReadFile() 不返回 0 ?程序尝试永远从管道读取数据
- waveOutWrite 缓冲区永远不会返回到应用程序
- Poco C++ 1.4.3p1 的 DatagramSocket ReceiveBytes() 永远不会返回。我是否滥用了该功能?
- 为什么从 write() 调用 __kernel_vsyscall() 永远不会返回
- ICLRuntimeHost Start方法永远不会返回
- 为什么eof()永远不会返回true
- io_service::run() 永远不会返回
- 如何永远从"ACE_Reactor::instance()->run_reactor_event_loop();"街区返回?
- Winapi定时器回调线程,永远不会返回
- Boost read()永远不会返回,即使在服务器上执行写(ssl) Boost