이 글과 관련된 글
2010/11/15 - 내 맘대로 엔진 제작기 - 23 ( DirectX in C# )
2010/08/06 - gcroot를 이용해 관리 클래스 managed class 를 멤버로 사용
2010/04/20 - Native C++ <-> Managed C++ <-> C# 의 상호교류
2009/09/07 - Native C++로 작성된 프로젝트를 C#에서 사용하기
2010/11/15 - 내 맘대로 엔진 제작기 - 23 ( DirectX in C# )
2010/08/06 - gcroot를 이용해 관리 클래스 managed class 를 멤버로 사용
2010/04/20 - Native C++ <-> Managed C++ <-> C# 의 상호교류
2009/09/07 - Native C++로 작성된 프로젝트를 C#에서 사용하기
툴작업을 하다보면 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;
}
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 );
}
};
{
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() );
}
{
m_pFrameWork = new CFramework();
m_pFrameWork->SetLogger( new ManagedLogger() );
}
Native C++의 CFramework를 선언해주고, SetLogger 함수에 ManagedLogger 클래스의 객체 포인터를 넘겨주고 있다. ManagedLogger는 CLog 클래스를 상속받은 클래스 이므로, CLog 클래스로도 ManagedLogger 클래스를 가리킬수 있다. 이젠, 가상함수를 통해 Native C++ 영역에서 ManagedLogger의 함수를 호출할수 있는 것이다.