我在C++ dll上构建,通过在C#中编写代码.
我得到一个错误,说
检测到LoaderLock消息:尝试在OS Loader锁定内执行托管执行.不要尝试在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起.
我试着搜索这个错误究竟意味着什么,但是我正在绘制毫无意义的文章,大多说这只是一个警告,我应该在Visual Studio中关闭它.其他解决方案似乎是由于ITunes,或者在使用DirectX进行编程时出现此问题.我的问题与两者无关.
任何人都能解释一下,这究竟意味着什么?
当我在Windows XP上运行我的应用程序(WPF,VB.net 2008)时,我得到了奇怪的Windows错误.当我在出现错误和调试的机器上安装VS2008时.我有一个加载器锁异常,所以我进入Debug并删除它.但是,当它安装在机器上时,我仍然会收到错误.
有没有办法在安装应用程序时删除Loader Lock Exception.我确实理解它可能不是最好的解决方案,但似乎只有当我使用ReportViewer启动WindowsElementHost并且这导致问题时才会发生这种情况,因此我真的不知道还有什么可以解决它.
与2003年一样,所有版本的XP都存在这个问题.
在Windows 7和Vista中,我在调试和安装的产品时从未遇到过该错误.同样适用于2008和2008R2.
我最近将.NET NLog日志记录组件集成到我们的一个应用程序中,这些应用程序纯粹是在非托管代码(在Visual Studio 6中编译的C++和VB6组件)中开发的.我们有一堆C++应用程序通过COM接口与NLog通信.
目前一切正常,但我注意到在程序终止期间弹出以下消息(在输出窗口中调试VS6中的C++组件;如果在IDE中调试NLog,则通过VS 2005调试NLog):
检测到LoaderLock消息:尝试在OS Loader锁定内执行托管执行.不要尝试在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起.
DllMain如下:
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
Run Code Online (Sandbox Code Playgroud)
我的猜测_Module.Term();
现在包括释放一些.NET引用(我在我的一个C++类中保留对NLog对象的引用,以避免每次都必须实例化和释放),这会导致弹出此警告.
我的问题:这可以安全地忽略吗?如果不是,那么什么是好的解决方法?(我能想到的最好的方法是实例化对该NLog对象的引用,并在每次要写入日志文件时释放它...不是最优雅的解决方案)