2009-08-28 2 views
3

관리되는 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 
} 

답변

4

전체 프로젝트가 아니라 관리되는 코드를 사용하는 파일에만/clr 컴파일러 플래그를 추가해야합니다.

여기에, 비주얼 스튜디오 "마법사"무엇이며 내가 테스트 한 방법입니다

  • 는 비주얼 C++ ATL 프로젝트
  • 추가 된 ATL 단순 개체를 생성하는 COM을하기 위해 인터페이스 (프로젝트 -> 클래스 추가)
  • CLR 구성 요소 클래스가 추가되었습니다. 마법사가 "네이티브 프로젝트에 CLR 구성 요소를 추가하려고합니다. 프로젝트가 공용 언어 런타임 지원으로 변환됩니다."라는 메시지가 나타납니다.
  • 프로젝트를 컴파일하고 컴파일하고 잘 등록합니다.
  • 프로젝트 설정을 검사하지 않습니다 ->는 clrcomponennt.cpp 설정을 검사 "어떤 공용 언어 런타임 지원"
  • 를 -> "공용 언어 런타임 지원 (/ CLR)은"
  • 이는 OLEView에서 DLL을 개설 -> COM 인터페이스를했다 현재
  • 레드 게이트의 .NET 반사판에서 DLL이 오픈 -> clrcomponent 그래 그게 내가 파일의 맨의 #pragma 관리되지 않는 추가 ... 나을하지만 도움이되지 않았다
+1

고마워, 그거야. 나는 파일 기반으로 플래그를 설정할 수 있다는 것을 몰랐다. DLL 초기화 코드로 파일을 비/clr로 바꾸고 나머지는/clr 스위치를 켠 채로 두었다. – flatline

0

이 사용/CLR 플래그는 방법은 관리 (예. 그들이 MSIL 아래로 컴파일되고있다)했다,하지만 당신은있어 DllMain에 전화해서 - 관리하지 않았습니다. 불행히도, 그것은 나의 제한된 지식이 그것을 가지고 갈 수있는 한입니다.

+0

존재. – flatline

관련 문제