装载机锁定错误

时间:2020-03-05 18:51:28  来源:igfitidea点击:

我通过在C#中编写代码来构建C ++ dll。

我说错了

LoaderLock was detected Message:
  Attempting managed execution inside OS
  Loader lock. Do not attempt to run
  managed code inside a DllMain or image
  initialization function since doing so
  can cause the application to hang.

我尝试搜索该错误的确切含义,但是我写的文章毫无意义,主要是说这只是一个警告,我应该在Visual Studio中将其关闭。
其他解决方案似乎是由于iTunes引起的,或者是在使用DirectX编程时发生了此问题。我的问题与两个都不相关。

谁能解释,这实际上意味着什么?

解决方案

回答

加载程序锁定的一般思想:
系统在锁中(如同步锁中)在DllMain中运行代码。因此,在DllMain中运行非平凡的代码就是"寻求死锁",如此处所述。

问题是,为什么要尝试在DllMain中运行代码?在DllMain的上下文中运行此代码是否至关重要,还是可以生成一个新线程并在其中运行代码,而不必等待代码在DllMain内完成执行?

我认为特定于托管代码的问题是,运行托管代码可能涉及加载CLR之类的东西,并且不知道在那里可能发生什么会导致死锁……我不会听从"禁用此警告"的建议"如果我是我们,因为很有可能我们会发现在某些情况下应用程序意外挂起。

回答

我们需要转到菜单Debug-> Exceptions,打开Managed Debugging Assistants,找到LoaderLock并取消选中