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