Native C++에서 Managed C++에 접근이 필요할 때
Programming/C++/CLI / 2010. 11. 9. 13:59
툴작업을 하다보면 Native C++에서 Managed C++에 접근해야 할 필요가 있다.
정확히 말해서 두 영역간의 소통이 필요할때가 있다.
예로 현재 작업 중인 툴에서 C#에 만들어진 Log 폼 다이얼로그에 로그를 찍고 싶을 때, Native C++에서 어떻게 작업을 해야할까?
Native C++에서는 Managed C++ 코드를 사용하거나 함수를 호출할수도 없다.
해결 방법 중 하나는 클래스 상속과 다형성을 이용하는 방법이다.
먼저 Native C++에서 밑의 코드와 같이 정의해준다
그 다음 랩핑 클래스에서 위에서 정의한 CLog 클래스를 상속 받아 자식 클래스를 하나 만든다
주의할점은 주석에 적어놓았다. Managed 코드와 UnManaged 코드는 혼용될수 없으므로, 오로지 함수로만 통신을 해야한다.
자식 클래스를 정의 하였으면, 이제 이것을 사용해보자.
Native C++의 CFramework를 선언해주고, SetLogger 함수에 ManagedLogger 클래스의 객체 포인터를 넘겨주고 있다. ManagedLogger는 CLog 클래스를 상속받은 클래스 이므로, CLog 클래스로도 ManagedLogger 클래스를 가리킬수 있다. 이젠, 가상함수를 통해 Native C++ 영역에서 ManagedLogger의 함수를 호출할수 있는 것이다.
정확히 말해서 두 영역간의 소통이 필요할때가 있다.
예로 현재 작업 중인 툴에서 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의 함수를 호출할수 있는 것이다.
반응형
'Programming > C++/CLI' 카테고리의 다른 글
Part 1: How to Make Native Calls from Managed Code in C++/CLI (0) | 2010.12.20 |
---|---|
Arrays in C++/CLI (0) | 2010.11.26 |
C++/CLI Singleton (0) | 2010.10.22 |
C++/CLI 데이터 타입에 따른 리턴값, 파라미터 처리 (ActvieX ↔ C++/CLI ↔ C#) (0) | 2010.10.05 |
[Step.02-2] 클래스(class), 핸들(^), 그리고 구조체(struct) (0) | 2010.10.05 |