/clr 제한

사용 시 다음과 같은 제한 사항에 유의하세요 /clr.

  • 구조적 예외 처리기에서는 컴파일/clr할 때 사용 _alloca 제한이 있습니다. 자세한 내용은 _alloca를 참조하세요.

  • 런타임 오류 검사 사용할 수 /clr없습니다. 자세한 내용은 방법: 네이티브 런타임 검사 사용하세요.

  • 표준 C++ 구문만 사용하는 프로그램을 컴파일하는 데 사용되는 경우 /clr 인라인 어셈블리 사용에 다음 지침이 적용됩니다.

    • 기본 스택 레이아웃에 대한 지식을 전제로 하며 현재 함수의 범위를 벗어난 규칙 또는 컴퓨터에 대한 기타 하위 수준 정보를 호출하는 인라인 어셈블리 코드는 해당 지식이 관리형 함수의 스택 프레임에 적용되면 실패할 수 있습니다. 인라인 어셈블리 코드가 포함된 함수는 관리되지 않는 함수 /clr로 생성됩니다.

    • 복사 생성 함수 매개 변수를 전달하는 함수의 인라인 어셈블리 코드는 지원되지 않습니다.

  • 으로 컴파일된 /clr프로그램에서 함수 vprintf 를 호출할 수 없습니다.

  • 에서 naked__declspec 한정자가 무시됩니다 /clr.

  • 설정된 _set_se_translator Translator 함수는 관리되지 않는 코드의 catch에만 영향을 줍니다. 자세한 내용은 예외 처리를 참조 하세요.

  • 에서 함수 포인터 비교는 허용되지 /clr않습니다.

  • 완전히 프로토타입화되지 않은 함수의 사용은 다음에서 /clr허용되지 않습니다.

  • 다음 컴파일러 옵션은 다음과 같이 /clr지원되지 않습니다.

    • /EHsc/EHs (/clr내포됨 /EHa (예외 처리 모델 참조 /EH )

    • /fp:strict/fp:except (부동 소수점 동작 지정) 참조 /fp )

    • /Zd

    • /Gm

    • /MT

    • /RTC

    • /ZI

  • 전처리기 정의(/D_STATIC_CPPLIB)와 컴파일러 옵션의 /clr 조합 _STATIC_CPPLIB 은 지원되지 않습니다. 정의로 인해 애플리케이션이 지원되지 않는 정적 다중 스레드 C++ 표준 라이브러리와 연결되기 때문입니다. 자세한 내용은 /LD/MT/>(런타임 라이브러리 사용)을 참조/MD하세요.

  • 함께 /clr사용하면 /Zi 성능에 영향을 줍니다. 자세한 내용은 /Zi를 참조하세요.

  • 문자를 지정 /Zc:wchar_t 하거나 캐스팅하지 않고 .NET Framework 출력 루틴에 와이드 문자를 _wchar_t 전달하면 출력이 unsigned short int로 표시됩니다. 예시:

    Console::WriteLine(L' ')              // Will output 32.
    Console::WriteLine((__wchar_t)L' ')   // Will output a space.
    
  • /GS은 함수가 아래에 #pragma unmanaged 있거나 함수를 /clr네이티브 코드로 컴파일해야 하는 경우를 기준으로 컴파일할 때 무시됩니다. 이 경우 컴파일러는 기본적으로 꺼져 있는 경고 C4793을 생성합니다.

  • 관리되는 애플리케이션의 함수 서명 요구 사항을 참조 /ENTRY 하세요.

  • 애플리케이션을 컴파일하고 /openmp/clr 단일 appdo기본 프로세스에서만 실행할 수 있습니다. 자세한 내용은 (OpenMP 2.0 지원 사용)을 참조 /openmp 하세요.

  • 가변 인수 번호(varargs)를 사용하는 함수는 네이티브 함수로 생성됩니다. 가변 인수 위치의 관리되는 데이터 형식은 네이티브 형식으로 마샬링됩니다. 모든 System.String 형식은 실제로 와이드 문자열이지만 싱글 바이트 문자열로 마샬링됩니다. 따라서 지정자가 printf%S (wchar_t*)이면 대신 문자열로 %s 마샬링됩니다.

  • 매크로를 사용하는 경우 .으로 va_arg/clr:pure컴파일할 때 예기치 않은 결과가 발생할 수 있습니다. 자세한 내용은 , , va_copyva_endva_start를 참조하세요.va_arg /clr:pure/clr:safe 및 컴파일러 옵션은 Visual Studio 2015에서 더 이상 사용되지 않으며 Visual Studio 2017 이상에서는 지원되지 않습니다. “순수” 또는 “안전”해야 하는 코드는 C#으로 포팅해야 합니다.

  • 관리 코드에서 매개 변수 정보(함수 인수)를 가져오기 위해 스택을 안내하는 함수를 호출해서는 안 됩니다. P/Invoke 계층을 사용하면 해당 정보가 스택 아래로 더 내려갈 수 있습니다. 예를 들어 .을 사용하여 프록시/스텁 /clr을 컴파일하지 마세요.

  • 가능한 경우에는 함수가 관리 코드로 컴파일되지만, 모든 C++ 구문을 관리 코드로 변환할 수 있는 것은 아닙니다. 이는 함수별로 결정됩니다. 함수의 일부를 관리 코드로 변환할 수 없는 경우 전체 함수가 대신 네이티브 코드로 변환됩니다. 다음은 컴파일러가 관리 코드를 생성하지 못하게 차단하는 사례입니다.

    • 컴파일러에서 생성한 썽크 또는 도우미 함수. 네이티브 썽크는 가상 함수 호출을 포함하여 함수 포인터를 통해 모든 함수 호출에 대해 생성됩니다.

    • setjmp 또는 longjmp를 호출하는 함수

    • 특정 내장 루틴을 사용하여 머신 리소스를 직접 조작하는 함수. 예를 들어 __enable__disable, _ReturnAddress_AddressOfReturnAddress 또는 멀티미디어 내장 함수를 사용하면 모두 네이티브 코드가 됩니다.

    • #pragma unmanaged 지시문을 따르는 함수. (역, #pragma managed또한 지원됩니다.)

    • 정렬된 형식, __declspec(align(...))을 사용하여 선언된 형식을 포함하는 함수

참고 항목