1. Win32 DLL 프로젝트로 작성된 클래스
// MyClass.h
class __declspec(dllexport) CMyClass
{
public:
int Func1(int a, int b);
void Func2(int *a);
};
// MyClass.cpp
int CMyClass::Func1(int a, int b)
{
return (a + b);
}
int CMyClass::Func2(int *a)
{
*a++;
}
해당 DLL의 클래스는 C++에서 바로 사용이 가능하지만
C#에서는 사용이 힘들다 (가능할것같지만 너무 어려워서 포기)
2. Class Library로 작성된 클래스
// MyClassWrapper.h
#include "MyClass.h"
namespace Wrapper
{
public ref class CMyClassWrapper
{
private:
CMyClass *m_MyClass;
public:
CMyClassWrapper();
virtual ~CMyClassWrapper();
public:
int Func1(int a, int b);
void Func2(int %a);
};
}
// MyClassWrapper.cpp
namespace Wrapper
{
CMyClassWrapper::CMyClassWrapper()
{
m_MyClass = new CMyClass;
}
CMyClassWrapper::~CMyClassWrapper()
{
if(m_MyClass != 0)
delete m_MyClass;
}
int CMyClassWrapper::Func1(int a, int b)
{
return m_MyClass->Func1(a, b);
}
void CMyClassWrapper::Func2(int %a)
{
int temp;
m_MyClass->Func2(&temp);
a = temp;
}
}
원래 클래스의 함수를 호출시켜주기만 하는 단순한 클래스인데
다만 포인터를 매개변수로 받는 함수들은 좀 까다로움 ㅜㅜ
구글검색해보면 문자열이나 콜백함수포인터들을 받아서 처리하는방법도 볼수있지만 어렵네요 ㅋㅋ
CLI문법은 참 특이하네요.. %를 나머지연산할때빼고 저렇게 쓰는건 첨봄;;
3. C#에서 사용
Wrapper에서 빌드해 나온 DLL을 참조추가만 하면 바로 사용이 가능.
[DllImport(...)] 따위 안써도 되는 편의성! (단지 이거하나때문에...)
using MyClassWrapper;
namespace TestProject
{
public class Test
{
CMyClassWrapper obj = new CMyClassWrapper();
private void foo()
{
int value = obj.Func1(10, 5);
// value == 15
obj.Func2(ref value);
// value == 16
}
}
}
저번에 관련 질문 올렸을때 답변달아주신 분들 감사합니다.
이제 가능성 여부 테스트가 끝났으니 개발을 시작 ㅋㅋㅋ