Share via


/clr(공용 언어 런타임 컴파일)

CLR(공용 언어 런타임)의 기능을 응용 프로그램과 구성 요소에서 사용할 수 있도록 합니다.

/clr[:options]

인수

  • options
    다음 스위치 중 하나 이상을 쉼표로 구분하여 지정합니다.

    • /clr
      응용 프로그램에 대한 메타데이터를 만듭니다. 메타데이터는 다른 CLR 응용 프로그램에서 사용할 수 있으며, 다른 CLR 구성 요소의 메타데이터에 있는 형식과 데이터를 응용 프로그램에서 사용할 수 있도록 합니다.

      자세한 내용은 다음을 참조하십시오.

      혼합형(네이티브 및 관리) 어셈블리

      방법: /clr로 마이그레이션.

    • /clr:pure
      네이티브 실행 코드 없는 유일한 출력 파일인 MSIL(Microsoft Intermediate Language)을 생성합니다. 그러나 MSIL로 컴파일된 네이티브 형식을 포함할 수 있습니다.

      자세한 내용은 순수형 및 안정형 코드(C++/CLI)을 참조하십시오.

    • /clr:safe
      네이티브 실행 코드가 없는 MSIL 전용의 안정성을 확인할 수 있는 출력 파일을 생성합니다. /clr:safe를 사용하면 안정성 확인 진단(PEVerify 도구(Peverify.exe))이 활성화됩니다.

      자세한 내용은 확인할 수 있는 형식 안전 코드 작성을 참조하십시오.

    • /clr:oldSyntax
      원래의 Visual C++ 구문인 Managed Extensions for C++ 구문을 CLR 프로그래밍에 사용할 수 있게 합니다. 

      Managed Extensions for C++ 구문은 더 이상 사용되지 않습니다. Managed Extensions for C++을 사용하는 응용 프로그램을 유지 관리할 경우에만 /clr:oldSyntax를 사용합니다. 새 응용 프로그램을 개발하는 경우 업데이트된 구문을 사용합니다. 자세한 내용은 Language Features for Targeting the CLR을 참조하십시오.

      Managed Extensions for C++ 응용 프로그램이 있는 경우 새 구문을 사용하도록 프로젝트를 업그레이드할 수 있습니다. 자세한 내용은 프로그램 이식 및 업그레이드을 참조하십시오.

    • /clr:noAssembly
      어셈블리 매니페스트를 출력 파일에 삽입하지 않도록 지정합니다. 기본적으로 noAssembly 옵션은 설정되어 있지 않습니다.

      noAssembly 옵션은 사용되지 않습니다. 대신 /LN(MSIL 모듈 만들기)를 사용하십시오. 자세한 내용은 Visual C++ 2005의 사용되지 않는 컴파일러 옵션을 참조하십시오.

      매니페스트에 어셈블리 메타데이터가 없는 관리되는 프로그램을 모듈이라고 합니다. noAssembly 옵션은 모듈을 생성하는 데만 사용할 수 있습니다. /c/clr:noAssembly을 사용하여 컴파일하는 경우에는 링커 단계에서 /NOASSEMBLY 옵션을 지정하여 모듈을 만듭니다.

      Visual C++ 2005 전에는 /clr:noAssembly/clr로 간주했습니다. 그러나 이제 /clr/clr:oldSyntax도 지원하므로 /clr:noAssembly를 지정해야 할 경우 /clr 양식을 지정해야 합니다. 예를 들어, /clr:noAssembly /clr을 지정하면 새로운 Visual C++ CLR 구문을 사용하여 모듈이 작성되고, /clr:noAssembly,oldSyntax를 지정하면 Managed Extensions for C++를 사용하여 모듈이 작성됩니다.

      Visual C++ 2005 전에는 /clr:noAssembly에서 /LD를 필요로 했습니다. 이제는 /clr:noAssembly를 지정하면 /LD가 암시적으로 함께 지정됩니다.

    • /clr:initialAppDomain
      Visual C++ 응용 프로그램을 CLR 버전 1에서 실행할 수 있습니다. initialAppDomain을 사용할 경우, Microsoft 기술 지원 웹 사이트의 BUG: AppDomainUnloaded exception when you use managed extensions for Visual C++ components에 설명된 문제 중 일부가 나타날 수 있습니다.

      initialAppDomain을 사용하여 컴파일한 응용 프로그램은 CLR 버전 1에서 지원되지 않으므로 ASP.NET을 사용하는 응용 프로그램에 사용되지 않아야 합니다.

    • /clr:nostdlib
      컴파일러에 기본 \clr 디렉터리를 무시하도록 지시합니다. System.dll과 같은 여러 DLL을 포함할 경우 컴파일러에서 오류가 발생합니다. 이 옵션을 사용하면 컴파일할 때 사용할 특정 프레임워크를 지정할 수 있습니다.

설명

관리 코드는 CLR로 검사하고 관리할 수 있는 코드입니다. 관리 코드는 관리되는 개체에 액세스할 수 있습니다. 자세한 내용은 /clr 제한을 참조하십시오.

관리되는 형식을 정의하고 사용하는 응용 프로그램을 개발하는 방법에 대한 자세한 내용은 Language Features for Targeting the CLR을 참조하십시오.

/clr을 사용하여 컴파일한 응용 프로그램에는 관리되는 데이터가 포함되거나 포함되지 않을 수 있습니다.

관리되는 응용 프로그램을 디버깅할 수 있도록 하려면 /ASSEMBLYDEBUG(DebuggableAttribute 추가)를 참조하십시오.

가비지 수집된 힙에서는 CLR 형식만 인스턴스화할 수 있습니다. 자세한 내용은 Classes and Structs (Managed)을 참조하십시오. 함수를 네이티브 코드로 컴파일하려면 unmanaged pragma를 사용하십시오. 자세한 내용은 managed, unmanaged을 참조하십시오.

기본적으로 /clr는 설정되어 있지 않습니다. /clr이 적용되면 /MD도 적용됩니다. 자세한 내용은 /MD, /MT, /LD(런타임 라이브러리 사용)을 참조하십시오. /MD는 표준 헤더(.h) 파일에서 런타임 루틴의 동적으로 연결되는 다중 스레드 버전이 선택되었는지 확인합니다. 다중 스레드는 CLR 가비지 수집기가 보조 스레드에서 종료자를 실행하므로 관리되는 프로그래밍에 필요합니다.

/c을 사용하여 컴파일하는 경우 /CLRIMAGETYPE을 사용하여 결과 출력 파일의 CLR 형식(IJW, safe 또는 pure)을 지정할 수 있습니다.

/clr/EHa를 함축하고 있으며 다른 /EH 옵션은 /clr에 사용할 수 없습니다. 자세한 내용은 /EH(예외 처리 모델)을 참조하십시오.

파일의 CLR 이미지 형식을 확인하는 방법에 대한 자세한 내용은 /CLRHEADER를 참조하십시오.

링커의 특정 호출에 전달되는 모든 모듈은 동일한 런타임 라이브러리 컴파일러 옵션(/MD 또는 /LD)을 사용하여 컴파일해야 합니다.

어셈블리에 리소스를 포함하려면 /ASSEMBLYRESOURCE 링커 옵션을 사용합니다. /DELAYSIGN, /KEYCONTAINER/KEYFILE 링커 옵션을 사용하여 어셈블리가 작성되는 방식을 사용자 지정할 수도 있습니다.

/clr이 사용되면 _MANAGED 기호는 1로 정의됩니다. 자세한 내용은 Predefined Macros을 참조하십시오.

실행 파일이 DLL인 경우 DllMain을 진행하는 동안 네이티브 개체 파일의 전역 변수가 먼저 초기화된 다음 관리되는 섹션의 전역 변수가 다른 관리 코드를 실행하기 전에 초기화됩니다. #pragma init_seg는 관리되는 범주 및 관리되지 않는 범주에서 초기화의 순서에만 영향을 줍니다.

/clr:safe로 컴파일하는 것은 C# 등의 언어에서 /platform:anycpu로 컴파일하는 것과 같습니다.

안전 이미지와 순수 이미지

순수 이미지는 CLR 버전의 C 런타임(CRT) 라이브러리를 사용합니다. 그러나 CRT는 안정성을 확인할 수 없으므로 /clr:safe를 사용하여 컴파일할 때는 CRT를 사용할 수 없습니다. 자세한 내용은 C Run-Time Libraries을 참조하십시오.

순수 이미지에 표시할 수 없는 네이티브 코드의 예로는 인라인 어셈블리, setjmplongjmp 등이 있습니다.

순수 이미지나 안전 이미지의 모든 진입점은 관리됩니다. /clr을 사용하여 컴파일하는 경우 진입점은 네이티브입니다. 자세한 내용은 __clrcall을 참조하십시오.

/clr:safe를 사용하여 컴파일하는 경우 기본적으로 변수가 appdomain이고 프로세스당 지정할 수 없습니다. /clr:pure의 경우, appdomain이 기본값이지만 프로세스 변수를 사용할 수 있습니다.

/clr 또는 /clr:pure를 사용하여 컴파일한 32비트 .exe 파일을 64비트 운영 체제에서 실행하는 경우 응용 프로그램은 WOW64에서 실행됩니다. 이렇게 하면 32비트 응용 프로그램을 64비트 운영 체제에서 32비트 CLR을 통해 실행할 수 있습니다. 기본적으로 /clr:safe를 사용하여 컴파일한 .exe 파일은 64비트 운영 체제가 실행되는 컴퓨터에서 64비트 CLR에 실행됩니다. 32비트 운영 체제에서는 동일한 .exe 파일을 32비트 CLR에서 실행합니다. 그러나 안전 응용 프로그램은 32비트 구성 요소를 로드할 수 있습니다. 이 경우 운영 체제의 64비트 지원 기능을 사용하여 실행되는 안전 이미지가 32비트 응용 프로그램을 로드할 때 문제가 발생할 수 있습니다(BadFormatException). 64비트 운영 체제에서 32비트 응용 프로그램을 로드할 때도 안전 이미지가 계속 실행되도록 하려면 /CLRIMAGETYPE을 사용하여 메타데이터(.corflags)를 변경하고 응용 프로그램이 WOW64에서 실행되도록 표시해야 합니다. 다음 명령줄은 예제입니다. 진입점 기호를 적절하게 바꾸십시오.

cl /clr:safe t.cpp /link /clrimagetype:pure /entry:?main@@$$HYMHXZ /subsystem:console

데코레이팅된 이름을 얻는 방법에 대한 자세한 내용은 목록을 사용하여 데코레이팅된 이름 보기을 참조하십시오. 64비트 프로그래밍에 대한 자세한 내용은 Visual C++를 사용한 64비트 프로그래밍을 참조하십시오.

샘플, 연습 및 추가 정보는 다음 항목을 참조하십시오.

메타데이터와 명명되지 않은 클래스

명명되지 않은 클래스는 메타데이터에 **$UnnamedClass$crc-of-current-file-name$index$**와 같은 형식으로 이름이 지정되어 표시됩니다. 여기에서 index는 컴파일에 포함된 명명되지 않은 클래스의 일련 번호입니다. 예를 들어, 다음 코드 예제는 메타데이터에 명명되지 않은 클래스를 생성합니다.

// clr_unnamed_class.cpp
// compile by using: /clr /LD
class {} x;

메타데이터를 보려면 ildasm.exe를 사용합니다.

Visual Studio에서 이 컴파일러 옵션을 설정하려면

  1. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭한 다음 속성을 클릭하여 프로젝트 속성 페이지 대화 상자를 엽니다.

  2. 구성 속성 폴더를 선택합니다.

  3. 일반 속성 페이지에서 공용 언어 런타임 지원 속성을 수정합니다.

    참고

    속성 페이지 대화 상자에서 /clr을 사용하도록 설정한 경우, /clr과 호환되지 않는 컴파일러 옵션 속성이 필요에 따라 적절히 조정됩니다. 예를 들어, /RTC를 설정한 다음 /clr를 활성화하면 /RTC가 자동으로 해제됩니다.

    또한 /clr 응용 프로그램을 디버그하는 경우 디버거 형식 속성을 혼합 또는 관리 전용으로 설정합니다. 자세한 내용은 C++ 디버그 구성에 대한 프로젝트 설정을 참조하십시오.

    모듈을 만드는 방법에 대한 자세한 내용은 /NOASSEMBLY(MSIL 모듈 만들기)를 참조하십시오.

프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면

참고 항목

참조

컴파일러 옵션

컴파일러 옵션 설정