336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
C# 에서 C++ DLL 불러서 쓰기 #3
3. Class 가져오기
C++ DLL 에
#ifdef BOX_EXPORTS
#define BOX_API __declspec(dllexport)
#else
#define BOX_API __declspec(dllimport)
#endif
C++
Class BOX_API Box{
public:
Box();
int setInt(int a);
void setString(char* str);
}
이런 클래스가 존재하고
C# 에서 해당 클래스를 불러서 사용하려고 한다,
C#
namespace BoxConsoleApplication
{
class Program
{
unsafe static void Main(string[] args)
{
Box b = new Box();
int c = b.setInt(3);
b.setString("HelloWorld");
}
}
}
이렇게 사용하고 싶다.
하지만 바로 저렇게 사용 할 수는 없다.
참조하여도 해당 멤버들이 [개체브라우저]에 보이지 않는 멤버들을 직접 명시하여 참조해 주어야한다.
C++ 클래스가 보이지 않으므로
C++ 클래스를 활용 할 수 있는 전역 함수들을 만들어서
명시하여 C# 에서 사용한다.
C++
Class BOX_API CBox{
public:
CBox();
int setInt(int a);
void setString(char* str);
}
.h File
extern "C" BOX_API Box* CreateCBox();
extern "C" BOX_API void DisposeCBox(CBox* pObject);
.c File
extern "C" BOX_API CBox* CreateCBox()
{
return new CBox();
}
extern "C" BOX_API void DisposeCBox(CBox* pObject)
{
if (pObject != NULL)
{
delete pObject;
pObject = NULL;
}
}
CBox 객체를 만들고 해당 객체를 반환하고,
CBox 를 받아서 해당 객체를 지워주는 함수 2개를 일단 생성한다.
함수 원형과 함수 구현을 .c , .h 파일로 나누어 두었는데,
.h 에 모두 구현하게 되면
.h(104): error C2491: 'CreateCBox' : dllimport 함수을(를) 정의할 수 없습니다.
라는 에러를 보게 될 것이다.
만들어진 C++ 의 Create, Dispose 함수를 C# 에서 사용 해 본다.
C#
namespace BoxConsoleApplication
{
class Program
{
[DllImport("Box.dll", CallingConvention = CallingConvention.Cdecl)]
static public extern IntPtr CreateCBox();
[DllImport("Box.dll", CallingConvention = CallingConvention.Cdecl)]
static public extern void DisposeCBox(IntPtr pTestClassObject);
unsafe static void Main(string[] args)
{
IntPtr pCBoxClass = CreateCBox(); ;
DisposeCBox(pCBoxClass );
pCBoxClass = IntPtr.Zero;
}
}
}
이렇게 하면
C++ DLL 의
클래스가
만들어진다.
나머지 멤버 함수들을 가져오는 것은 다음에 정리한다.