我正在为AutoCAD 2009开发一个附加组件。项目输出是一个类库。当我尝试调试并加载类库时,我得到了“LoaderLock被检测到的消息”。我一直在写这些附加组件,这是我见过的第一个这种类型的消息。
检测到LoaderLock 消息:尝试在OS Loader锁定内执行托管执行。不要尝试在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起。
我转到Debug -> Exceptions -> "Managed Debugging Assistants"
,找到"LoaderLock"
并取消选中"Thrown"
复选框。
我可以再次调试,但我做了什么,为什么我必须这样做?这会给我带来其他问题吗?
答案 0 :(得分:16)
加载程序锁是一个进程范围的锁,系统使用它来将对加载DLL的访问同步到进程地址空间。加载DLL,免费DLL,查询DLL信息等的函数都获取加载器锁。最常影响开发人员的是在DllMain运行时保持加载程序锁定 - 这意味着在运行代码时可以保留通常不知道的操作系统锁定。
可以将加载程序锁定视为锁定层次结构中的非常低级别。在DllMain期间在加载程序锁定下运行的代码可能是死锁的原因。例如,CLR有自己的一组内部锁,它可以在加载DLL时保存。如果从DllMain中调用托管代码,则可能导致线程上的CLR在保持加载程序锁定的同时获取其中一个锁定。如果另一个线程上的CLR获得了该锁(导致DllMain中的原始线程阻塞)然后尝试加载一个将获取加载器锁的DLL,那么您的进程将会死锁。
听起来CLR正试图抢先检测加载程序锁定下运行的托管代码。当您在调试器中看到此故障的堆栈时,请确定导致托管代码在DllMain中运行的原因并将其删除。
答案 1 :(得分:3)
根据我使用AutoCAD的经验,可以安全地忽略LoaderLock警告。这并不表示您的代码出错了,而是由于AutoCAD加载和初始化应用程序的方式而引发警告。
答案 2 :(得分:1)
这是Visual Studio 2005中的一个错误。请阅读本文以获取更多详细信息:http://support.microsoft.com/kb/913996