C#의 .dll Library를 C++에서 활용하기
(C# 프로그램을 .dll Library로 만드는 방법은 여기를 클릭)
C#에서 생성한 .dll파일과 .tlb 파일을 C++의 해당 프로젝트 폴더안과 .exe 실행파일이 있는 곳에 복사해 넣는다.
이제 남은 것은 C++ 소스코드 작성법만 알면 C#에서 만든 .dll Library를 C++에서 사용할수 있게 된다.
샘플 예제 코드는 다음과 같다. 각 부분에 대한 설명은 아래 코드상에 있다.
아래 코드는 MFC에서 정보 확인 버튼 클릭시 C# .dll Library의 특정 메소드(함수)를 실행하고 C# .dll이 던져주는 정보(결과)를 보여주는 기능을 구현한 코드 조각이다.
이때 다음과 같이 .tlb 파일을 #include 아랫쪽에 import해 주어야 정상적으로 C# .dll 라이브러리에 있는 메소드들을 MFC에서 사용할수 있다.
#import "ExMakeClassLibSerialRead.tlb" no_namespace named_guids
//MFC에서 C#의 라이브러리 .dll을 이용한다.
void CMFC_UseCsharpDllDlg::OnBnClickedButton1()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
//ICallClass는 C#의 interface이름이다.
//public interface ICallClass { .... }과 같이 C#에서 선언되어 있는 부분이다.
ICallClass *csharp = NULL;
//CoInitialize()
//==> Initializes the COM library on the current thread and identifies the concurrency model
//==> as single-thread apartment (STA).
//COM이란, 컴포넌트 오브젝트 모델(Component Object Model, COM)은 마이크로소프트가 개발한
//소프트웨어 구성 요소들의 응용 프로그램 이진 인터페이스이다.
//COM을 이용해 개발된 프로그램들은 프로세스간 통신과 동적 오브젝트 생성이 가능하다.
CoInitialize(NULL);
//typedef long HRESULT
//CoCreateInstance(CLSID_C#의클래스이름, NULL, CLSCTX_INPROC_SERVER, IID_C#의interface이름,
// reinterpret_cast<void**>(&C#의interface이름type으로선언된참조변수명));
//아래의 CLSID_Class1에서 Class1은 C#에서 사용자가 필요로하는 기능을 담고 있는 클래스인데
//C#에서 다음과 같이 정의되어 있다.
//public class Class1 : ICallClass { ... } 자세한 것은 C#의 ExMakeClassLibSerialRead라는 이름의 프로젝트를 참조할 것
//아래에서 IID_ICallClass에서 ICallClass는 C#에서 public interface ICallClass { ... }와 같이 선언된 부분의 interface 이름이다.
HRESULT hr = CoCreateInstance(CLSID_Class1, NULL, CLSCTX_INPROC_SERVER, IID_ICallClass, reinterpret_cast<void**>(&csharp));
//SUCCEEDED macro
//Provides a generic test for success on any status value.
//BOOL SUCCEEDED(HRESULT hr);
//==> hr : The status code.This value can be an HRESULT or an SCODE.A non - negative number indicates success.
//==> Return value : TRUE if hr represents a success status value; otherwise, FALSE.
if (SUCCEEDED(hr))
{
//showInfo() 함수는 C#에서 public void showInfo() { ... }과 같이 정의되어 있는 C#용 메소드이다.
csharp->showInfo();
CString msg = csharp->getInfo();
MessageBox(msg);
}
else {
MessageBox(_T("실패~\n\nC++의 exe 실행파일이 있는 위치에 \nC#에서 생성한 .dll과 .tlb가 있어야 합니다."));
}
}
'C++' 카테고리의 다른 글
C++ 2차원 포인터(포인터의 포인터)를 이용한 2차원 배열 다루기 (0) | 2017.08.03 |
---|---|
memcpy()함수를 이용한 문자열 복사 하기 (0) | 2017.07.25 |