방법: _vcclrit.h에 대한 종속성 제거
업데이트: 2007년 11월
Visual C++ .NET 및 Visual C++ 2003에서 /clr 컴파일러 옵션을 사용하여 컴파일된 DLL은 로드 시 명확하지 않은 교착 상태에 빠질 수 있습니다. 일반적으로 이를 로더 잠금 문제라고 하며 이 문제에 대한 자세한 설명은 혼합형 어셈블리 초기화에 나와 있습니다.
이 문제를 해결하기 위해 Visual C++ 2003에는 로더 잠금을 일으키지 않는 방식으로 DLL을 초기화하는 데 도움이 되는 _vcclrit.h가 포함되어 있습니다. Visual C++ 2005의 경우에는 교착 상태의 발생 가능성을 크게 줄일 수 있도록 전혀 다른 방식으로 초기화가 처리되므로 이 헤더 파일이 필요하지 않습니다.
이전 버전과의 호환성을 위해 _vcclrit.h는 계속 포함되어 있으며 이를 사용하는 코드도 계속 작동하지만 _vcclrit.h의 내용은 사용되지 않습니다. 이 항목에서는 이 헤더 파일에 대한 종속성을 제거하는 데 필요한 몇 가지 권장되는 수정 사항을 설명합니다.
참고: |
---|
이상적인 해결책은 아니지만 _vcclrit.h를 포함하기 전에 _CRT_VCCLRIT_NO_DEPRECATE를 정의하면 _vcclrit.h를 사용할 때 이 파일이 이제는 사용되지 않는다는 경고가 표시되지 않도록 할 수 있습니다. |
링커 설정 변경 사항
Visual C++ 2003 로더 잠금 문제를 해결하기 위한 권장 방법을 사용하는 프로젝트에서 _vcclrit.h를 제거하기 위해서는 다음과 같은 사항을 변경해야 합니다. 이러한 변경 사항에는 링커 설정에 대한 변경도 포함됩니다. Visual Studio에서 이러한 설정을 변경하는 방법에 대한 자세한 내용은 프로젝트 설정 수정을 참조하십시오.
/NOENTRY 링커 스위치를 제거합니다. _vcclrit.h를 사용하려면 링커에 /NOENTRY(진입점 없음) 스위치를 제공해야 합니다. 이 스위치는 이제 필요하지 않습니다.
링커에 MSVCRT.LIB를 명시적으로 입력하지 말아야 합니다. 이전에는 /NOENTRY 스위치가 필요했으므로 CRT 라이브러리 파일 MSVCRT.LIB에 명시적으로 링크해야 했습니다. 그러나 /NOENTRY가 제거되면서 이 라이브러리는 /clr 컴파일 시 기본적으로 링크됩니다.
NOCHKCLR.OBJ를 링커 입력에서 제거합니다. 이 파일은 이제 필요하지 않습니다.
강제 기호 참조를 제거합니다. 이전에는 /INCLUDE 스위치를 사용하여 __DllMainCRTStartup@12, __crt_dll_initialize 및 __crt_dll_terminate 같은 기호를 강제로 적용해야 했습니다. Visual C++ 2005에서는 이러한 기호가 필요하지 않으므로 이를 제거해도 아무런 문제가 없습니다.
코드 변경 사항
코드에서 #include <_vcclrit.h>를 제거하는 작업 이외에도 코드의 성격에 따라서는 몇 가지 사항을 추가로 변경해야 할 수 있습니다. 최소한 __crt_dll_initialize 및 __crt_dll_terminate는 이제 호출되지 않으므로 이를 제거해도 아무런 문제가 없습니다.