visual-studio-2005 - 为什么我在调试时收到 "LoaderLock was detected"警告?

标签 visual-studio-2005 class-library autocad

我正在为 AutoCAD 2009 开发附加组件。项目输出是一个类库。当我尝试调试和加载类库时,我收到“检测到 LoaderLock 消息”。我一直在编写这些附加组件,这是我看到的第一条此类消息。

  • 我从哪里开始尝试解决这个问题?
  • 什么是 LoaderLock,为什么它现在困扰着我?

  • 检测到 LoaderLock
    消息:尝试在 OS Loader 锁内进行托管执行。不要尝试在 DllMain 或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起。

    我去了Debug -> Exceptions -> "Managed Debugging Assistants" , 找到 "LoaderLock"并取消选中 "Thrown"复选框。

    我可以再次调试,但我做了什么,为什么我必须这样做?这会给我带来其他问题吗?

    最佳答案

    加载器锁是一个进程范围的锁,系统使用它来同步将 DLL 加载到进程地址空间的访问。加载 DLL 的函数、释放 DLL 的函数、查询 DLL 信息等,都获得了加载器锁。通常对开发人员影响最大的是在 DllMain 运行时也持有加载程序锁 - 这意味着在运行代码时可以持有您通常不知道的操作系统锁。

    加载器锁可以被视为处于锁层次结构中的一个非常低的级别。在 DllMain 期间在加载程序锁下运行的代码可能是导致死锁的原因。例如,CLR 有它自己的一组内部锁,它可以在加载 DLL 时持有这些锁。如果从 DllMain 中调用托管代码,则可能导致线程上的 CLR 在持有加载程序锁的同时获取这些锁之一。如果另一个线程上的 CLR 已获取该锁(导致 DllMain 中的原始线程阻塞),然后尝试加载将获取加载器锁的 DLL,则您的进程将死锁。

    听起来 CLR 正试图在加载器锁定下抢先检测正在运行的托管代码。当您在调试器中看到此故障的堆栈时,请确定导致您的托管代码从 DllMain 中运行的原因并将其删除。

    关于visual-studio-2005 - 为什么我在调试时收到 "LoaderLock was detected"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/889736/

    相关文章:

    asp.net - 部署引用与 WCF 服务通信的类库的 Web 应用程序

    c# - 如何在 WCF 和 Silverlight 应用程序上使用相同的类库

    java - 如何从 AutoCAD 创建的 DXF 中提取组件?

    visual-studio - Visual Studio - "attach to particular instance of the process"宏

    vb.net - 如何将vb类添加到类库中?

    c++ - 通过引用传递智能指针

    c++ - 在 C++ 中链接和通信到 AutoCAD

    asp.net - 安装 Visual Studio Express 2010

    c# - 无法加载文件或程序集 'System.Net.Http,版本 = 4.1.1.1 .Net Standard

    .net - 将参数传递给 .NET 定义的命令