попытка выполнения управляемого кода под блокировкой os loader
Loader lock error
I am building on C++ dll, by writing code in C#.
I get an error, saying
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.
I tried seraching what this error exactly means, but I am drawing pointless articles, mostly saying that it’s just a warning, and I should switch that off in Visual Studio. The other solutions seem to be due to ITunes, or this problem occurring when programming with DirectX. My problem is connected to neither.
Can anybody explain, what this actually means?
9 Answers 9
The question is, why are you trying to run code inside DllMain? Is it crucial that this code run inside the context of DllMain or can you spawn a new thread and run the code in it, and not wait for the code to finish execution inside DllMain?
I believe that the problem with manged code specifically, is that running managed code might involves loading the CLR and suchlike and there’s no knowing what could happen there that would result in a deadlock. I would not heed the advice of «disable this warning» if I were you because most chances are you’ll find your applications hangs unexpectedly under some scenarios.
Since step #2 is performed outside of the Loader Lock, there is no deadlocks. The details are described at Initialization of Mixed Assemblies.
To ensure your mixed mode assembly can be loaded from a native executable, the only thing you need to check is that DllMain method is declared as native code. #pragma unmanaged could help here:
Compiler helps a little by giving you warining C4747 if it detects that DllMain is not declared as unmanaged:
However compiler won’t generate any warnings if DllMain indirectly calls some other managed function, so you need to ensure that never happens, otherwise your application could deadlock randomly.
Помощник по отладке управляемого кода loaderLock
Помощник по отладке управляемого кода loaderLock (MDA) определяет попытки выполнения управляемого кода в потоке, который удерживает блокировку загрузчика операционной системы Microsoft Windows. Любое подобное выполнение кода недопустимо, поскольку оно может привести к взаимоблокировке и использованию библиотек DLL до того, как они будут инициализированы загрузчиком операционной системы.
Симптомы
Взаимоблокировка также может возникнуть, если поток ожидает запуска или завершения другого потока. При запуске или завершении потока этот поток должен получить блокировку загрузчика операционной системы, чтобы передать события в связанные библиотеки DLL.
Наконец, в некоторых случаях вызовы библиотек DLL могут происходить до того, как эти библиотеки были инициализированы загрузчиком операционной системы. В отличие от сбоев по причине взаимоблокировки, которые можно определить, просмотрев стеки всех потоков, включенных во взаимоблокировку, выявить использование DLL-библиотек, которые не были инициализированы, без помощника по отладке управляемого кода очень трудно.
Причина
Решение
Влияние на среду выполнения
Как правило, блокировка возникает для нескольких потоков внутри процесса. Один из этих потоков, скорее всего, будет отвечать за сборку мусора, поэтому взаимоблокировка может оказать значительное влияние на весь процесс. Кроме того, это приведет к невозможности выполнения дополнительных операций, требующих блокировки загрузчика операционной системы, таких как загрузка и выгрузка сборок или библиотек DLL и запуск или остановка потоков.
В некоторых нетипичных случаях также возможно нарушение прав доступа или похожие проблемы в библиотеках DLL, которые вызываются до их инициализации.
Выходные данные
Помощник по отладке управляемого кода сообщает о попытке недопустимого выполнения управляемого кода. Изучите стек потока, чтобы понять, почему происходит блокировка загрузчика и как решить эту проблему.
Работа с несколькими файлами
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщения 3
#1 Тема от NomadV 13 декабря 2013г. 16:54:32
Тема: Работа с несколькими файлами
Есть необходимость в программе, которая бы открывала dwg файлы, производила с ними определенные операции (извлечение информации о содержимом, очистка, сохранение под другим именем и т.п.). Начитавшись сайтов и форумов, сваял вот такое:
При отладке, когда программа доходит до строки
LoaderLock was detected
Message: Попытка выполнения управляемого кода под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.
LoaderLock, конечно, можно отключить в Visual Studio, но при отладке тогда получаю сообщение:
mt.dll
A debugger has been found running in your system. Please, unload it from memory and restart your program
,
а при загрузке dll без отладки, открывается первый файл, а потом каждый раз вручную приходится активировать файл, который был открыт до запуска команды, чтобы программа продолжала работать.
Пробовал другой способ доступа к базе чертежей. Что-то типа этого:
опять получаю ошибку «LoaderLock was detected». Что я делаю неправильно? Это как-то связано с блокированием документов? Конструкции типа
в моей программе нужны? Тестирую с Autocad 2014, если это имеет значение.
Microsoft.DirectX.AudioVideoPlayback: выдает ошибку «Сборка для смешанного режима построена на основе версии «v1.1.4322»
Выдает ошибку «использована неинициализированная локальная переменная «flag» » и с переменной «sum_check» та же проблема
//func.cpp #include using namespace std; #include «func.h» //Функция, которая.
Когда-то сталкивался с такой проблемой.
В проекте найдите файл app.config.
В нем замените startup на
Добавлено через 16 минут
Собственно в свойствах проекта во вкладке application можно изменить версию Фреймворка на 2.0. Дело в том, что Managed Directx 9 устарел и уже не поддерживается. Оболочка иксов писалась под 2.0. Я к тому, что можно и не изменять файл app.config, а поменять всего лишь версию проекта. Так-то.
. эээмммммммммммммммммм WPF, почему сразу не написали?
А что вы хотите реализовать? Дело в том, что если проигрывать видое, то придется шаманить с контролами вплоть до привязки контрола Windows Forms.
Я точно не помню, но у класса Video, есть метод (должен быть), video.чтототам, который привязывается к контролу именно windows forms.
Но опять же в WPF, есть возможность разместить элемент WinForms внутри окна WPF …этот гемор вм нужен??
Создайте обыкновенное Windows Form Application.
есть и обыкновенная Windows Form но в ней я вообще файла app. не нашел =( А реализовать я хочу аудио-плеер. Но срезался в самом начале =) не могу заставить его воспроизводить выбранный файл вот эта ошибка вылазит
В Вин формс измените версию в Фреймворка в свойствах проекта. В app.config должен быть именно вон тот код для 4.0
Добавлено через 10 минут
Создал новый проект Windows Form с использование Fraemwork 2.0 подключил эту библиотеку выбираю файл и программа закрывается из-за ошибки.
Может быть в свойствах твоего проекта нужно сменить построение с Any CPU на x32. В этом тоже может быть проблема.
Работает такой код.
Добавлено через 8 минут
А вот этот не работает не могу понять в чем все таки проблема=(((
Добавлено через 41 секунду
А какой эксепшен вылазиет?
Добавлено через 5 минут
Хм, ваш код у меня работает.
Я в настройках поменял платформу на x86 и теперь тот код работает =)))
Добавлено через 4 минуты
Какая то у меня студия шальная через раз работает и переодически ругается на то что «На задан экземпляр класс»
Попытка выполнения управляемого кода под блокировкой os loader
достался проект где используется Microsoft.DirectX.AudioVideoPlayback.dll
при запуске приложения из под студии вылетает такой ексепшн
Библиотека «C:\Windows\assembly\GAC\Microsoft.DirectX.AudioVideoPlayback\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.AudioVideoPlayback.dll» пытается выполнить управляемый код под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.
нажимаю F5 проект запускается и все работает, кроме функций плеера
если просто запустить откомпилированный екзешник, то ничего не вылтеает и приложение полностью функционирует.
как можно избавиться от ексепшена
Библиотека «C:\Windows\assembly\GAC\Microsoft.DirectX.AudioVideoPlayback\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.AudioVideoPlayback.dll» пытается выполнить управляемый код под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.
при компиляции?
От: | Аноним | |
Дата: | 22.05.08 12:58 | |
Оценка: |
Здравствуйте, sv219, Вы писали:
S>достался проект где используется Microsoft.DirectX.AudioVideoPlayback.dll
S>при запуске приложения из под студии вылетает такой ексепшн
S>Библиотека «C:\Windows\assembly\GAC\Microsoft.DirectX.AudioVideoPlayback\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.AudioVideoPlayback.dll» пытается выполнить управляемый код под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.
S>нажимаю F5 проект запускается и все работает, кроме функций плеера
S>если просто запустить откомпилированный екзешник, то ничего не вылтеает и приложение полностью функционирует.
S>как можно избавиться от ексепшена
S>Библиотека «C:\Windows\assembly\GAC\Microsoft.DirectX.AudioVideoPlayback\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.AudioVideoPlayback.dll» пытается выполнить управляемый код под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.
S>при компиляции?
Нажать Ctrl+Alt+E там найти managed debugging assistance (3й сверху) в нем — loader lock и у брать напротив галочку.. и все будет ок..