이 글과 관련글
Manage C++ 에서는 위의 추상 클래스를 상속 받아 Managed C++ 상에서 클래스를 구현합니다.
2010/11/15 - 내 맘대로 엔진 제작기 - 23 ( DirectX in C# )
2010/08/06 - gcroot를 이용해 관리 클래스 managed class 를 멤버로 사용
2009/09/07 - Native C++에서 Managed C++에 접근이 필요할 때
2009/09/07 - Native C++로 작성된 프로젝트를 C#에서 사용하기
2010/08/06 - gcroot를 이용해 관리 클래스 managed class 를 멤버로 사용
2009/09/07 - Native C++에서 Managed C++에 접근이 필요할 때
2009/09/07 - Native C++로 작성된 프로젝트를 C#에서 사용하기
이전에도 포스팅 했던 내용인데...
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에 멤버변수로 포함 될수 없기 때문에 정적 함수 호출을 통해 간접적으로만 접근이 가능합니다.
C# 부분에서는 Wrapper 클래스를 생성하고, 로그 다이얼로그의 핸들을 넘겨주는 것이 전부입니다.
여기까지가 대략적인 Native C++ -> Managed C++ -> C# 의 과정을 통해 C#의 다이얼로그에 접근한 방법인데요.
// 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#의 다이얼로그에 접근한 방법인데요.
보시다시피 굉장히 돌아가고 있습니다. 보다 좋은 방법이 없을까 궁리를 해봤지만, 딱히 방법이 떠오르지 않네요.
혹시 다른 좋은 의견 있으시면 조언 좀 부탁드리겠습니다.