2017년 12월 7일 목요일

C#의 .dll Library를 C++에서 활용하기





C#의 .dll Library를 C++에서 활용하기
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가 있어야 합니다."));
}
}

댓글 없음:

댓글 쓰기