.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
그러나 DllMain이 다른 관리 함수를 간접적으로 호출하는 경우 컴파일러는 경고를 생성하지 않으므로 절대 발생하지 않도록해야합니다. 그렇지 않으면 응용 프로그램이 임의로 교착 상태가 될 수 있습니다.