Почему я получаю предупреждение "LoaderLock был обнаружен" при отладке?

Я разрабатываю надстройку для AutoCAD 2009. Вывод проекта - это библиотека классов. Когда я пытаюсь отлаживать и загружать библиотеку классов, я получаю это сообщение "LoaderLock было обнаружено". Я писал эти дополнения некоторое время, и это первое сообщение этого типа, которое я видел.

  • Где я начинаю пытаться понять это?
  • Что такое LoaderLock и почему это беспокоит меня сейчас?

обнаружен LoaderLock Сообщение: попытка управляемого выполнения внутри блокировки загрузчика ОС. Не пытайтесь запустить управляемый код внутри функции DllMain или инициализации изображения, так как это может привести к зависанию приложения.

Я отправился в Debug -> Exceptions -> "Managed Debugging Assistants", нашел "LoaderLock" и снял флажок "Thrown".

Я могу снова отлаживать, но что я сделал и зачем мне это нужно? Это вызовет другие проблемы для меня?

Ответы

Ответ 1

Блокировка загрузчика - это блокировка процесса, используемая системой для синхронизации доступа к загрузке DLL в адресное пространство процесса. Функции, которые загружают DLL, бесплатные DLL, информацию о запросах DLL и т.д., Все приобретают блокировку загрузчика. Что обычно влияет на разработчиков, большинство из них заключается в том, что блокировка загрузчика сохраняется в то время как DllMain работает также - это означает, что блокировка ОС, о которой вы, как правило, не знаете, может быть сохранена во время запуска вашего кода.

Блокировка загрузчика можно рассматривать как находящуюся на очень низком уровне в иерархии блокировок. Код, запущенный под замком загрузчика во время DllMain, может быть причиной взаимоблокировок. Например, CLR имеет свой собственный набор внутренних блокировок, которые он мог бы удерживать при загрузке DLL. Если вы вызываете управляемый код из своего DllMain, вы можете заставить CLR на вашем потоке приобрести один из этих блокировок, удерживая блокировку загрузчика. Если CLR в другом потоке приобрел эту блокировку (заставляя исходный поток в DllMain блокироваться), а затем попытался загрузить DLL, которая приобрела блокировку загрузчика, ваш процесс был бы тупиком.

Похоже, что CLR пытается упреждающим образом обнаружить управляемый код под блокировкой загрузчика. Когда вы видите стек из этого отказа в отладчике, определите, что вызывает запуск управляемого кода из DllMain, и удалите его.

Ответ 2

В моем опыте с AutoCAD предупреждение LoaderLock можно смело игнорировать. Это не признак того, что ваш код делает что-то неправильно, а скорее предупреждение возникает из-за того, как AutoCAD загружает и инициализирует ваше приложение.

Ответ 3

Это ошибка в Visual Studio 2005. Прочтите эту статью для более подробной информации: http://support.microsoft.com/kb/913996