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

업데이트: 2007년 11월

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

/clr[:options]

인수

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

    • /clr
      현재 응용 프로그램의 메타데이터를 만들어 다른 CLR 응용 프로그램에서 사용할 수 있도록 하고, 다른 CLR 구성 요소의 메타데이터에 있는 형식과 데이터를 현재 응용 프로그램에서 사용할 수 있도록 합니다.

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

    • /clr:pure
      네이티브 실행 코드가 없는 MSIL 전용 출력 파일을 생성합니다. MSIL로 컴파일된 네이티브 형식은 이 파일에 포함될 수 있습니다.

      자세한 내용은 순수형 및 안정형 코드를 참조하십시오.

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

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

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

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

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

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

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

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

      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
      버전 1의 공용 언어 런타임에서 Visual C++ 응용 프로그램을 실행할 수 있도록 합니다. initialAppDomain을 사용하는 경우 기술 자료 문서 Q309694에서 설명하는 몇 가지 문제가 발생할 수 있습니다. 기술 자료 문서는 MSDN Library 미디어나 https://support.microsoft.com/support/에 있습니다.

      initialAppDomain을 사용하여 컴파일한 응용 프로그램을 ASP.NET을 사용하는 응용 프로그램에 사용하지 마십시오. C++로 ASP.NET 작업을 수행하려면 새 버전의 런타임으로 업그레이드하십시오.

설명

관리 코드는 공용 언어 런타임으로 검사하고 관리할 수 있는 코드입니다. 관리 코드는 관리되는 개체에 액세스할 수 있습니다.

/clr 제한도 참조하십시오.

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

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

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

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

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

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

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

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

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

어셈블리에 리소스를 포함하려면 /ASSEMBLYRESOURCE(관리되는 리소스 포함) 옵션을 사용합니다. /DELAYSIGN(어셈블리에 부분적으로 서명), /KEYCONTAINER(어셈블리에 서명할 키 컨테이너 지정)/KEYFILE(어셈블리에 서명할 키 또는 키 쌍 지정) 링커 옵션을 사용하여 어셈블리가 작성되는 방식을 사용자 지정할 수도 있습니다.

/clr를 사용하는 경우 _MANAGED 기호가 1로 정의됩니다. 자세한 내용은 Predefined Macros를 참조하십시오.

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

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

안전 이미지와 순수 이미지

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

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

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

/clr:safe를 사용하여 컴파일하는 경우 변수는 기본적으로 appdomain이며 프로세스별로 지정할 수 없습니다. /clr:pure를 사용하는 경우 기본 설정은 appdomain이지만 process 변수를 사용할 수 있습니다.

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

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

데코레이팅된 이름을 가져오는 데 대한 자세한 내용은 목록을 사용하여 데코레이팅된 이름 보기를 참조하십시오. 64비트 프로그래밍에 대한 자세한 내용은 64비트 프로그래밍(Visual C++ 작업 절차)을 참조하십시오.

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

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

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

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

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

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

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오.

  2. 구성 속성 폴더를 클릭합니다.

  3. 일반 속성 페이지를 클릭합니다.

  4. 공용 언어 런타임 지원 속성을 수정합니다.

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

    참고:

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

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

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

참고 항목

참조

컴파일러 옵션

컴파일러 옵션 설정