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가 있어야 합니다."));

}

}



+ Recent posts