Data Analysis for Investment & Control

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

Code/C++:C#:MFC

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

아슈람 2014. 4. 17. 00:51
반응형

 

이전에는 MFC 기반의 응용프로그램을 만드는 프로젝트에서 사용했기 때문에 dll 생성을 확장 dll(extension dll)로 만들어 사용했었다. 그런데, C#에서 사용하려고 하니 이 방법으로는 할 수가 없게 되었다. 이의 해결 방법을 알아보던 중, CLI(Common Language Infrastructure)로 wrapping하는 방법이 있다는 걸 알게 되었다.

문제는 내가 확장 DLL만을 사용해봤기 때문에 기본 DLL을 생성해서 다른 프로젝트에 추가하는 방법을 모른다는 것이다. 게다가 C++ DLL을 사용하려는 타겟 프로젝트 환경이 MFC 기반이 아니기 때문에 어떻게 추가를 해줘야 하는지도 모르겠다.

먼저, 테스트를 위해 DLL 프로젝트를 하나 생성한다.

DLL 빌드 옵션은 '공유 MFC DLL을 사용하는 기본 DLL(Regular DLL using shared MFC DLL)'로 선택한다. 다른 옵션은 선택하지 않는다.

프로젝트를 생성하면 아래와 같이 "P3Core"라는 이름의 DLL에 CP3CoreApp라는 Class 가 생성됨을 알 수가 있다.

 

 

추가적인 코딩은 하지 말고 그대로 빌드 하게 되면, P3Core.dll, P3Core.lib 등이 생성된다.


-------------------------------------


자, 이제 위의 DLL을 Wrapping 하기 위한 CLR 프로젝트를 생성해보자.

 

 

위와 같이 프로젝트 설정을 Visual C++ > CLR > 클래스 라이브러리로 선택한다. 이 CLR 프로젝트를 빌드하면, C# 프로젝트에서 사용할 수 있는 DLL로 빌드된다.


생성된 CLR 프로젝트에 C++로 작성된 P3Core.dll을 적용 시켜줘야 하는데, 이를 위해서 해야할 작업은 3가지이다.

1) lib 링크 시키기
2) dll 파일 import 시키기(코딩)
3) 헤더파일 include 하기


extern "C" __declspec( dllexport) int SetCmd(int index);

와 같은 형태로 하는 건 잘못된 건가???

C++ dll을 만들 때, CP3Core 클래스를 만들고, 이에 대한 선언,

extern "C" __declspec( dllexport) CP3Core* pCore;

을 통해 클래스의 인스턴스 객체를 CLR 프로젝트에 넘기는 것이 가능할려나?? 물론 CLR 프로젝트에 헤더 파일은 포함시켜야 겠지...

=> CP3Core가 MFC 기반이므로 헤더를 포함시킬 경우, 에러가 난다. 따라서 이 방법은 사용 못할 듯...


 

 

반응형
Comments