title: "C++/CLI로 Managed Type, Native Type 짬뽕하기(2/2)"
description: "C++/CLI로 Managed Type, Native Type 짬뽕하기(2/2)"
cleanUrl: /sw-engineer/cplusplus-cli-mix-managed-native-2
ogImage: ""
floatFirstTOC: right

C++/CLI로 Managed Type, Native Type 짬뽕하기(1/2) 에서 계속하여

1. Native Type의 Method 안에서 Managed Type 생성 및 사용 가능

단, 해당 .cpp 파일은 /clr(공용 언어 런타임 지원) 옵션으로 컴파일해야함.

ref class Managed {};

class Native
{
public:
    void Method() { Managed^ managed = gcnew Managed(); };
};

2. clr based enumeration 사용 가능

ref class enum ClrEnum { Entry };

class Native
{
    int GetEntry() { return (int)ClrEnum::Entry; }  //가능
};

3. Native Type의 멤버 변수로 Managed Type 선언 및 생성 불가

ref class Managed {};

class Native
{
    Managed managed;      //불가
    Managed^ managed;     //불가
};

참고

  1. C++ 프로젝트 전체에 /clr 컴파일 옵션을 주지 않고도 파일(.cpp) 별로 컴파일 옵션을 설정하는 것이 가능하다.
  2. /clr 옵션은 /Yu (미리 컴파일된 헤더 사용), /Gy (함수 수준 링크 사용) 등의 몇몇 컴파일 옵션과 호환되지 않으므로 이전보다 빌드 속도가 떨어진다.

결론

매우 어렵고도 복잡하던 Native와 Managed간 상호 운용성이 획기적으로 개선됨. COM 등의 복잡한 루틴을 통하지 않고도, Managed 코드에서 Native 코드를 사용한다던가 반대로 Native 코드에서 .NET 클래스 라이브러리를 포함한 Managed 코드 사용이 가능해졌다는 이야기.

p.s**.** MFC 8.0에 추가된 Winform지원 라이브러리를 통해 MFC 기반 윈도우에 Winform 컨트롤을 호스팅하는 것은 매우 쉽다. 하지만 Winform 기반 윈도우에 MFC 기반 컨트롤을 호스팅하는 코드는 추가되지 않았으며, MSDN에도 설명이 없다.

Hosting of MFC MDI applications from within WinForms and WPF applications은 이러한 단점을 보완하는 컬럼으로서, Winform 및 WPF 호스트에서 MFC 애플리케이션을 호스팅하는 방법과 이를 위한 간단한 라이브러리를 보여주고 있다. 이 컬럼에서는 놀랍게도 Native MDI 애플리케이션을 약간의 코드 수정만으로 Winform 및 WPF 기반 호스트에 포팅하고 있다. (Native 코드는 유니코드로 컴파일 가능해야함을 전제로 걸고 있다).