블로그 이미지
대갈장군

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

Notice

2013. 9. 20. 23:48 프로그래밍/MSDN

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)
가장 강력크한 놈이 나타났다. 이 옵션을 키고 컴파일을 때리면 작성되는 코드는 CLR 환경에서 100% 호환되게 작동되며 어떤 보안 옵션도 어기지 않고 말 잘듣는 코드로 생성된다. 예를 들자면 실행전에 디스크에 파일을 생성하고 지울수 있는 권한이 있는지 미리 확인하고 체크하여 사용자에게 알려주는 그런 기능. 당연히 이 옵션을 키면 CRT 서포트는 없다. 고로 Managed 코드를 섞어 쓸수 없다는 말이다. 

이 옵션을 사용하면 일단 당연히 보안성이 높아지고 특정 개발 환경에서 요구되기도 하며 미래에 나올 윈도우즈 환경에서도 잘 작동하는 프로그램을 작성하게 되는 것이다. 단점이라면 C++ interop 을 사용할 수 없다는 점.

마지막으로 P/Invoke를 사용하면 어떤 옵션으로 컴파일 하던간에 Native DLL을 임포트 할 수 있지만 런타임 환경에서 잘 작동할거라는 보장은 없다. 당연한 이야기지...... ㅋㅋ 

다음으로 P/Invoke에 대해서 알아봐야 겠군.



posted by 대갈장군