C#을 툴로 사용할 경우 애로 사항이 많이 발생하네요. 이전에 올린 방법으로 비관리 코드 Native Code에서 관리 코드 Managed Code를 사용하려고 하면 우회에 우회를 통해 사용하는데 이게 너무 불편했습니다. 정적 함수를 이용해야 하고, 직관적이지도 못하고...

그래서 다른 방법이 있지 않을까 하다가 gcroot란 것을 찾아냈습니다. 이걸 왜 지금까지 몰랐을까!? gcroot는 비관리 코드에서 관리 객체를 사용할수 있게 해주는 마법같은 템플릿 이더군요. 덕분에 또 하나의 랩핑 클래스 wrap class 를 이용하여 비관리 코드에서 관리되는 객체를 좀더 수월하게 조작할수 있게 되었습니다.



// Managed C++ Class
public ref class CCLR
{

public:
	CCLR();
	~CCLR();
public:
	void Init( void );

	void SetTreeView( TreeView^ pTreeView ); // C#에서 생성된 트리뷰를 설정
	void AddToTreeView( LPCTSTR strLog ); // 트리뷰에 아이템 추가

public:
	CNativeCPP*		m_pNativeCPP; // Native C 클래스 포인터
	CCLR2*			m_pCCLR2; // Managed C++ 클래스를 랩핑해주는 클래스 포인터
	TreeView^		m_pTreeView; // C#의 트리뷰 포인터
};

// Unmanaged Class. Native C에 의해 사용될 랩핑 클래스
// gcroot를 사용하기 위해서 vcclr 헤더가 필요
#include <vcclr.h>
public class CCLR2 : public CAbstCLR
{
public:
	CCLR2();
	~CCLR2();

public:
	virtual void AddToTreeView( LPCTSTR strMsg );

public:
	gcroot<cclr^>	m_cclr; // gcroot를 이용해 managed class를 멤버 변수로 지정
};

// Native C에서 사용 예. 
void CNativeCPP::SetBridge( CAbstCLR* pBridge )
{
	m_pBridge = pBridge;
	m_pBridge->AddThis( L"Hello" );
}

+ Recent posts