Data Analysis for Investment & Control

C++ dll의 CLR 프로젝트(C++/CLI)의 사용(2) 본문

Code/C++:C#:MFC

C++ dll의 CLR 프로젝트(C++/CLI)의 사용(2)

아슈람 2014. 4. 18. 19:06
반응형

 

많은 삽질을 통해 드디어 C++ <=> C++/CLI <=> C#을 연동하는 코드 테스트에 성공했다. 역시나 머리가 나쁘면 몸이 피곤하다. 썩 마음에 드는 방법은 아니고, 제한적이긴 하지만, known data typed 기반의 interface를 구현하는 것으로 연동이 가능할 듯 하다.

구현 순서는 아래와 같이 한다.

1. C++ dll 구현 : Regular DLL using shared MFC DLL 기반
2. C++/CLI 기반의 Wrapper Class 구현 : 여기서는 명시적 링크 방법을 사용
3. C# 프로젝트에서 C++/CLI dll을 추가시켜 사용

먼저, C++ DLL 구현이다. 

1. C++ dll 구현 : Regular DLL using shared MFC DLL 기반

<header>

 

 

헤더에서 P3Base.h 파일을 include 시켰다. 이 파일은 CWnd를 상속받은 클래스로 MFC 기반의 클래스이다. 따라서, 실제에서는 CP3Core Class의 헤더를 include 하면 된다.

<source>

 

여기서는 샘플로 SetCmd라는 함수를 구현하여 테스트 했다. DLL 파일이므로 CP3Case의 인스턴스를 하나 만들고, 이를 기반으로하는 interface 함수의 하나로 SetCmd를 export 시키기 위해 위와 같이 구현하였다. 빌드를 하면 P3Core.dll 파일이 생성될 것이다.



2. C++/CLI 기반의 Wrapper Class 구현 : 여기서는 명시적 링크 방법을 사용

<header>

 

 

필수적으로 include 해야 하는 파일은 windows.h이다. HINSTANCE 등의 타입을 사용하기 위해 반드시 추가해야 한다. 

static int (*vfpSetCmd)(int);

위의 선언은 C++ dll에서 export 한 함수를 사용하기 위한 함수 포인터를 잡아줄 함수형 변수이다. namespece P3CoreWrapper 로 선언한 내용 안에 CP3CoreIF라는 이름의 Class에 DLL을 로드하기 위한 HINSTANCE 변수가 선언이 되어 있다. 또한 C#에서 사용하게 하기 위해 Class method인 SetCmd를 따로 선언 및 정의해 준다.

<source>

 

Class의 생성자 CP3CoreIF()에서는 DLL을 로드하고 헤더에서 선언한 함수 타입의 변수에 DLL의 export 함수를 assign 하는 코드가 구현되어 있다.
(이미지를 캡쳐하다보니 DLL 경로가 짤려있다. DLL이 위치한 경로를 리턴 받아서 사용하는 루틴을 추가해야 하는데, 아직 방법을 모르겠다.)

vfpSetCmd에 정상적으로 DLL 내 method의 주소값이 할당이 되었다면, CP3CoreIF::SetCmd()의 함수가 정상 동작을 할 것이다.


3. C# 프로젝트에서 C++/CLI dll을 추가시켜 사용

 

 

프로젝트에서 위와 같이 '참조 추가'를 통해 C++/CLI 프로젝트이 빌드 결과물인 P3CoreIF.dll을 추가한다.

 

 

 

 

 

C++/CLI 프로젝트에서 사용했던 namespace인 P3CoreWrapper를 사용하도록 선언하고, MainWindow() 내에서 C++/CLI Class 인스턴스를 하나 선언하여 사용한다.


이로써 C++ Native 코드를 그대로 사용하기 위해 서로 상이한 managed code와 unmanaged code 기반의 프로젝트를 연동시키는 기초적인 작업을 해보았다. 이 feasibility를 기반으로 원하는 기능을 확장시켜 사용하면 될 것 같다.
일반적으로 알려진 데이터 타입 int, unsigned int, double과 같은 인자나 리턴 타입을 가지는 method 구현은 문제가 없겠으나 string 타입의 경우는 C++과 C#이 서로 다른 것 같은데, 이 부분에 대한 호환성은 좀 더 연구해 봐야 할듯하다.

혹시나 C++/CLI에서 MFC 기반의 Class 헤더를 그대로 사용할 수 있는 방법도 시간이 된다면 고민을 해봐야겠다.


 


반응형
Comments