Den*_*ail 15 class-library visual-studio-2005 autocad
我正在为AutoCAD 2009开发一个附加组件.项目输出是一个类库.当我尝试调试并加载类库时,我得到了"LoaderLock被检测到的消息".我一直在写这些附加组件,这是我见过的第一个这种类型的消息.
检测到LoaderLock消息:尝试在OS Loader锁定内执行托管执行.不要尝试在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起.
我去了Debug -> Exceptions -> "Managed Debugging Assistants",找到"LoaderLock"并取消选中了"Thrown"复选框.
我可以再次调试,但我做了什么,为什么我必须这样做?这会给我带来其他问题吗?
Mic*_*ael 16
加载程序锁是系统使用的进程范围锁,用于将对加载DLL的访问同步到进程地址空间.加载DLL,免费DLL,查询DLL信息等的函数都获取加载器锁.最常见的影响开发人员的是在DllMain运行时保持加载程序锁定 - 这意味着在运行代码时可以保留您通常不知道的操作系统锁定.
可以将加载程序锁定视为锁定层次结构中的非常低级别.在DllMain期间在加载程序锁定下运行的代码可能是死锁的原因.例如,CLR有自己的一组内部锁,它可以在加载DLL时保存.如果从DllMain中调用托管代码,则可能导致线程上的CLR在保持加载程序锁定的同时获取其中一个锁定.如果另一个线程上的CLR已获得该锁定(导致DllMain中的原始线程阻塞)然后尝试加载将获取加载程序锁定的DLL,则您的进程将死锁.
听起来CLR正试图抢先检测加载器锁定下运行的托管代码.当您在调试器中看到此故障的堆栈时,请确定导致托管代码在DllMain中运行的原因并将其删除.
| 归档时间: |
|
| 查看次数: |
20666 次 |
| 最近记录: |