관리되는 C++로 마이그레이션하려는 여러 COM 인터페이스를 구현하는 C++ dll이 있습니다. 나는/clr 컴파일러 플래그를 설정하고 Runtime Library 속성을/MT에서/MD로 변경하여이 두 플래그 간의 충돌을 피했지만 그게 전부입니다. 이 빌드 과정에서 DLL을 등록하려고 할 때, 나는 다음과 같은 오류가 발생합니다 :관리되는 C++ dll을 사용하는 로더 잠금 (regsvr32 R6033 오류)
이R6033은 - 네이티브 코드 초기화 이 동안이 어셈블리에서 MSIL 코드를 사용하려고 시도하는 응용 프로그램에 버그가 있음을 나타냅니다. 네이티브 생성자 또는 DllMain에서 MSIL로 컴파일 된 (/ clr) 함수를 호출 한 결과 일 가능성이 큽니다.
로더 잠금에 대해 읽었으며 알아낼 수 없습니다. 관리되는 코드에 하나의 호출을 추가하지 않았습니다. 다음은 DllMain 절차의 전체 내용입니다.
[편집 - 아래의 설명에 따라 #pragma unmanaged를 개선없이 cpp 파일 맨 위에 추가했습니다. 모듈 초기화 내가 무엇을 말할 수에서 ATL 라이브러리에 포함 된 모든 코드입니다.]
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
lpReserved;
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance, &MYGUID);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
고마워, 그거야. 나는 파일 기반으로 플래그를 설정할 수 있다는 것을 몰랐다. DLL 초기화 코드로 파일을 비/clr로 바꾸고 나머지는/clr 스위치를 켠 채로 두었다. – flatline