이 글과 관련글

이전에도 포스팅 했던 내용인데...
Native C++에서 Managed C++에 접근이 필요한 경우가 간혹 있습니다. 예로 C#에서 로그를 찍는 다이얼로그를 만들고, Native C++ 단에서 이 로그창에 로그를 찍기 위해서는 상당히 많이 돌아가야 하죠.

제가 사용하는 대략적인 코드입니다.
일단 Native C++ 상에서 로그 찍기를 위한 추상 클래스를 만듭니다.
그리고 그 추상 클래스를 기반으로 로그를 찍는 함수를 제작합니다.

// Native C++
class CLog
{
public:
	virtual void Print( const TCHAR* str ) = 0;
};

class CFramework
{
public:
	void SetLogger( CLog* log ) { m_pLogger = log; }
	void WriteLog( const TCHAR* strMessage, ... ) { m_pLogger->Print( szLogBuffer ); }
}

Manage C++ 에서는 위의 추상 클래스를 상속 받아 Managed C++ 상에서 클래스를 구현합니다.
그리고 C#의 로그 다이얼로그 창의 핸들을 들고 있는 Wrapper 클래스에 로그를 찍는 함수를 구현합니다.

여기서 Wrapper 클래스는 관리되는 객체로 ManagedLogger에 멤버변수로 포함 될수 없기 때문에 정적 함수 호출을 통해 간접적으로만 접근이 가능합니다.
// Managed C++
public class ManagedLogger : public CLog
{
public:
	virtual void Print( const TCHAR* str )
	{
		CFrameworkWrapper::WriteLog( str );
	}
};

public ref class CFrameworkWrapper
{
public:
	void SetLogBox( ListBox^ pBox );
	static void WriteLog( const TCHAR* strLog );
	void Create( void ) {
		m_pFrameWork = new ae_CFramework();
		m_pFrameWork->SetLogger( new ManagedLogger() );
	}
}

C# 부분에서는 Wrapper 클래스를 생성하고, 로그 다이얼로그의 핸들을 넘겨주는 것이 전부입니다.
// C#
public partial class Mainform : Form
{
    public void InitializeFramework()
    {
        m_LogDlg = new LogDlg();
        m_Frameowrk = new CFrameworkWrapper();
        m_Frameowrk.Create();
        m_Frameowrk.SetLogBox(m_LogDlg.listBox1);
    }
}

여기까지가 대략적인 Native C++ -> Managed C++ -> C# 의 과정을 통해 C#의 다이얼로그에 접근한 방법인데요.
보시다시피 굉장히 돌아가고 있습니다. 보다 좋은 방법이 없을까 궁리를 해봤지만, 딱히 방법이 떠오르지 않네요.
혹시 다른 좋은 의견 있으시면 조언 좀 부탁드리겠습니다.

+ Recent posts