로더 잠금 오류
C #으로 코드를 작성하여 C ++ dll을 구축하고 있습니다.
오류가 발생합니다.
LoaderLock이 감지되었습니다. 메시지 : OS Loader 잠금 내에서 관리되는 실행을 시도 중입니다. DllMain 또는 이미지 초기화 함수 내에서 관리 코드를 실행하려고하면 응용 프로그램이 중단 될 수 있습니다.
이 오류가 정확히 무엇을 의미하는지 검색하려고 시도했지만 무의미한 기사를 그리는 중이며 대부분 경고 일 뿐이며 Visual Studio에서 해제해야합니다. 다른 솔루션은 ITunes 또는 DirectX로 프로그래밍 할 때 발생하는이 문제로 인한 것 같습니다. 내 문제는 둘 다와 관련이 없습니다.
아무도 이것이 실제로 무엇을 의미하는지 설명 할 수 있습니까?
메뉴 디버그-> 예외로 이동하여 Managed Debugging Assistants를 열고 LoaderLock을 찾아 선택 취소해야합니다.

로더 잠금의 일반적인 개념 : 시스템은 잠금 내부에서 DllMain의 코드를 실행합니다 (동기화 잠금에서와 같이). 따라서 여기에 설명 된대로 DllMain 내에서 중요하지 않은 코드를 실행하는 것은 "교착 상태에 대한 요청" 입니다.
문제는 왜 DllMain 내에서 코드를 실행하려고합니까? 이 코드가 DllMain의 컨텍스트 내에서 실행되는 것이 중요합니까? 아니면 새 스레드를 생성하고 코드를 실행할 수 있으며 DllMain 내에서 코드 실행이 완료 될 때까지 기다리지 않을 수 있습니까?
특히 관리되는 코드의 문제는 관리되는 코드를 실행하는 데 CLR을로드하는 것과 관련이있을 수 있으며 교착 상태가 발생할 수있는 상황을 알 수 없다는 것입니다. "이 경고를 사용하지 않도록 설정하십시오."라는 조언에주의하지 않을 것입니다. "대부분의 가능성 때문에 내가 당신이라면 일부 시나리오에서 응용 프로그램이 예기치 않게 중단되는 것을 알 수 있습니다.
.NET 4.0 및 최신 프레임 워크 업데이트
이것은 혼합 모드 DLL에 대한 지원에 심각한 초기화 문제가 있고 임의의 교착 상태가 발생하기 쉬운 .Net 2.0 당시에 묻는 오래된 질문입니다. .Net 4.0부터 혼합 모드 DLL의 초기화가 변경되었습니다. 이제 두 가지 개별 초기화 단계가 있습니다.
- 기본 C ++ 런타임 설정 및 DllMain 메서드 실행을 포함하는 DLL의 진입 점에서 호출되는 기본 초기화.
- 시스템 로더에 의해 자동으로 실행되는 관리되는 초기화.
2 단계는 로더 잠금 외부에서 수행되므로 교착 상태가 없습니다. 자세한 내용은 혼합 어셈블리 초기화에 설명되어 있습니다.
혼합 모드 어셈블리를 네이티브 실행 파일에서로드 할 수 있는지 확인하려면 DllMain 메서드가 네이티브 코드로 선언되어 있는지 확인해야합니다. #pragma unmanaged여기에 도움이 될 수 있습니다.
#pragma unmanaged
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
... // your implementation here
}
DllMain이 직접 또는 간접적으로 호출 할 수있는 코드도 관리되지 않는 것도 중요합니다. DllMain에서 사용하는 기능 유형을 제한하여 DllMain에서 도달 할 수있는 모든 코드를 추적하고 모두 #pragma unmanaged.
컴파일러는 DllMain이 관리되지 않는 것으로 선언되지 않았 음을 감지하면 C4747을 경고하여 약간의 도움을줍니다.
1> Generating Code...
1>E:\src\mixedmodedll\dllmain.cpp : warning C4747: Calling managed 'DllMain': Managed code may not be run under loader lock, including the DLL entrypoint and calls reached from the DLL entrypoint
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.
Press ctr d+e Then Expend Managed Debugging Assistants Node. Then Unchecked the LoaderLock.
Hope this will help you.
kindly remind those VS2017 users that you need to disable "exception helper" instead of "exception assistant"(before VS2017) to prevent from loader lock error, which setting path is Debug->Exception. Just ran int to this problem and wasted 2 hours searching for solutions...
I recently got this error while creating an instance of an COM-Object written in native code:
m_ComObject = Activator.CreateInstance(Type.GetTypeFromProgID("Fancy.McDancy"));
This led to the described error. A "LoaderLock was detected"-Exception was thrown.
I overcame this error by creating the object-instance in an extra thread:
ThreadStart threadRef = new ThreadStart(delegate { m_ComObject = Activator.CreateInstance(Type.GetTypeFromProgID("Fancy.McDancy")); });
Thread myThread = new Thread(threadRef);
myThread.Start();
myThread.Join(); // for synchronization
I'm building a C++ CLR DLL (MSVS2015) that has to make calls into an unmanaged DLL and define unmanaged code. I use #pragma managed and #pragma unmanaged to control what mode it is in for a given area of the code.
In my case I simply put #pragma unmanaged in front of my DllMain() and this solved the problem. It seemed to be thinking I wanted a managed version of DllMain().
This problem occurs because of the way in which the debugger in Visual Studio runs managed applications that use Microsoft Foundation Classes version 8.0 in one or more DLL files.
Have a thorough reading at: http://msdn.microsoft.com/en-us/library/aa290048(vs.71).aspx
내 Visual Studio 2017 인스턴스의 설정 경로는 Debug-> Windows-> Exception Settings입니다. 예외 설정 "창"이 하단 탭 그룹 (별도의 창과 반대로)에 표시되어 눈에 띄는 데 시간이 걸렸습니다. "로더"를 검색합니다.
참고 URL : https://stackoverflow.com/questions/56642/loader-lock-error
'Programing' 카테고리의 다른 글
| 서비스에 애플리케이션 (비 인프라) 엔드 포인트가 없습니다. (0) | 2020.09.10 |
|---|---|
| 배치 파일에는 변수에 대한 외부 파일이 포함됩니다. (0) | 2020.09.10 |
| 열거 형 및 상수. (0) | 2020.09.10 |
| .jspf 파일 확장자 란 무엇입니까? (0) | 2020.09.10 |
| 내비게이션 컨트롤러가 내장 된 팝 오버는 후면 내비게이션의 크기를 고려하지 않습니다 (0) | 2020.09.10 |