Visual C++은 .NET 프로그래밍 환경에서 세가지 다른 형태의 CLR (Common Language Runtime) 컴파일 옵션을 제공하는데 고놈들이 바로 Mixed, Pure 그리고 Verifiable이다.
- Mixed (/clr)
이 녀석은 일반적인 기본 옵션이다. 말 그대로 섞여 있다는 말인데 무엇과 무엇이 섞여 있는냐 하면은, Managed 코드와 Unmanaged 코드가 섞여 있다는 의미다. 이 옵션을 켬으로써 Managed 코드와 Unmanaged 코드의 결혼을 성사시킨다는 말이다... 이것을 이른바 C++ Interop이라 부른다. 아마도 Interoperable의 약자가 아닐까?
- Pure (/clr:pure)
Pure 옵션의 경우는 Managed 와 Unmanaged 데이터 타입을 둘 다 가질 수 있지만 함수는 오직 Managed 형태만 소유 할 수 있다. Mixed와 마찬가지로 Pure Assembly는 P/Invoke를 통해서 Native DLL과의 Interop을 허락하지만 C++ Interop Feature는 불가하다. 잠깐만, 그러니까 이미 컴파일된 Managed 코드 DLL은 P/Invoke를 통해 함수를 호출해 사용할 수 있지만 코드 내에서 직접적으로 함수를 선언해서 호출하는 것 (다른 말로 C++ Interop)은 허락되지 않는다는 말인감? 그리고 한가지 더 중요한 점은 Pure Assembly는 Native 함수로 부터 호출가능한 함수를 Export할 수없는데 그 이유는 Pure Assembly는 __clrcall 호출 규약을 사용하기 때문이다.
- /clr:pure 사용의 장점
- 더 나은 성능: Pure Assembly는 오직 MSIL만 포함하고 있으므로 Native Function을 내포하고 있지 않다. 고로 Managed/Unmanaged Transition이 없다. 왔다리 갔다리 안한다는 말. (다만 P/Invoke를 이용해서 호출되는 경우는 예외다. 여전히 왔다리 갔다리 한다는 말)
- AppDomain Awareness: Managed 함수들과 CLR 데이터 타입은 전부다 Application Domain에 상주하고 있으므로 이런 함수와 데이터 타입에 대한 접근성이나 안정성이 Mixed assembly 경우보다 훨씬 더 낫다는 점. 그리고 .NET 프레임워크 내에서 다른 언어와의 호환성에서도 더 유리하다는 점.
- Non-disk loading: Pure Assembly들은 메모리 상에 로딩 될 수도 있고 심지어는 스트리밍이 될 수도 있다. Mixed 경우에는 반드시 디스크 상에 물질적으로 존재해야만 한다는 조건이 따라 붙는다.
- Reflection: Mixed 된 실행 파일은 Reflection이 허용되지 않지만 Pure의 경우에는 완전 서포트 해준다.
- Host Controllability: MSIL만 포함하고 있기 때문에 Mixed보다 예측가능하고 더 유연성 있게 코드를 작성할 수 있단다.
- /clr:pure 사용의 한계
- Pure Assembly는 Unmanaged Function으로부터 호출 되어 질 수 없다. 고로 Pure Assembly는 COM interface를 구현할 수 없고 또는 Native Callback을 드러낼 수도 없다. Pure Assembly는 __declspec(dllexport)나 .DEF 파일을 통해 함수를 Export할 수 없다.
- ATL과 MFC 라이브러리들은 지원되지 않는다.
- #import 지원 안됨
- 익셉션 핸들링과 얼라인먼트를 위한 플로팅 포인트 옵션 조정 불가. 고로 fpieee.h 와 같은 파일은 pure 옵션으로 컴파일 안됨
- GetLastError 함수는 pure 옵션에서 Undefined Behavior라는 에러로 처리됨. 헐퀴.
- Verifiable (/clr:safe)
'프로그래밍 > MSDN' 카테고리의 다른 글
Implicit Platform Invoke (0) | 2013.09.24 |
---|---|
Explicit PInvoke C++ (DllImport Attribute) (0) | 2013.09.24 |
[MSDN] .NET Framework 구조 (4) | 2013.05.03 |
Pure C++: Hello, C++/CLI (0) | 2013.04.25 |
Best Practices For Managed And Native Code Interoperability - Jesse Kaplan (0) | 2013.04.13 |