툴작업을 하다보면 Native C++에서 Managed C++에 접근해야 할 필요가 있다.
정확히 말해서 두 영역간의 소통이 필요할때가 있다.

예로 현재 작업 중인 툴에서 C#에 만들어진 Log 폼 다이얼로그에 로그를 찍고 싶을 때, Native C++에서 어떻게 작업을 해야할까?
Native C++에서는 Managed C++ 코드를 사용하거나 함수를 호출할수도 없다.
해결 방법 중 하나는 클래스 상속과 다형성을 이용하는 방법이다.

먼저 Native C++에서 밑의 코드와 같이 정의해준다

// 로그 클래스
class CLog
{
public:
        virtual void Print( const char* str ) = 0;
};

// 로그를 사용할 클래스
class CFramework
{
public:
        void SetLogger( ae_CLog* log ) { m_pLogger = log; }
private:
        CLog* m_pLogger;
}

그 다음 랩핑 클래스에서 위에서 정의한 CLog 클래스를 상속 받아 자식 클래스를 하나 만든다

public class ManagedLogger : public CLog
{
public:
        virtual void Print( const char* str )
        {
                // 이곳에 C#에서 수행할 작업을 코딩한다.
                // 이곳은 Unamanaged 영역이므로, 바로 Managed 코드를 못 쓴다.
                // 그러니 Managed 클래스에서 Static 함수를 만들어 여기서 호출해준다
                // 예) CFrameworkWrapper::WriteLog( str );
        }
};

주의할점은 주석에 적어놓았다. Managed 코드와 UnManaged 코드는 혼용될수 없으므로, 오로지 함수로만 통신을 해야한다.
자식 클래스를 정의 하였으면, 이제 이것을 사용해보자.

void CFrameworkWrapper::Create()
{
        m_pFrameWork = new CFramework();
        m_pFrameWork->SetLogger( new ManagedLogger() );
}

Native C++의 CFramework를 선언해주고, SetLogger 함수에 ManagedLogger 클래스의 객체 포인터를 넘겨주고 있다. ManagedLogger는 CLog 클래스를 상속받은 클래스 이므로, CLog 클래스로도 ManagedLogger 클래스를 가리킬수 있다. 이젠, 가상함수를 통해 Native C++ 영역에서 ManagedLogger의 함수를 호출할수 있는 것이다.

+ Recent posts