c# 에서 C++ dll 사용하기


C#에서 C++로 제작된 DLL을 사용하기 위한방법은 제가 아는건 크게 2가지 입니다.

1. DllImport 를 사용하는 방법
아마 대부분의 dll을 호출하는 방법이 DllImport 일것입니다... 이부분은 워낙 자료가 많으니 패쓰

2. Wrapper를 이용하여 Wrapping하는 방법
CLR을 이용하여 래핑하는 방법입니다. 물론 C++을 할줄 알아야 하는거구요..

저는 단순히 기본적인 래핑법만 소개하겠습니다.

우선 비쥬얼 스튜디오를 실행합니다.

프로젝트를 VC++의 CLR을 선택합니다.


VS2010 프리미엄 정품!! 입니다. ㅋㅋ

위와 같이 프로젝트를 만들어 줍니다..
그리고 프로젝트에 래핑항 라이브러리를 import 해주시고..

전 VS2010의 이 화면이 너무 마음에 들어용ㅇㅇㅇㅇ
(예전에 쓴글이라 그래요.. 지금은 2012사용중.. ㅎㅎ)


머 대충 기본생성된 모습입니다. 왠지모르게 c#의 냄새가..


필요한 dll을 wrapping하기 위해 새로운 클래스를 만들겠습니다.




이렇게 해서 wrapping은 끝납니다. 정말 간단하죠? 컴파일하고 만들어진 dll을 c# 프로젝트에서 참조추가 해주시면 됩니다.

문제는 위의 코드에서는 그냥 단순히 int 형을 넘기고 int 를 리턴받는 형식입니다만 c++이나 mfc로 dll을 만들다 보면 c++ 내에서만 쓰이는 변수형을 사용하게 됩니다. 그중 포인터와 구조체 이런거 뺴고 변수만 따졌을때 가장 많은 질문을 하는것이 c#의 string과 mfc의 CString간의 전달방법인데요. 생각보다 아주 간단합니다.

 c# 쪽에서는 그냥 string으로 함수로 넘겨주고
wrapping 해주는 쪽에서 받을때 System::String^ 으로 받아서 CString 쪽으로 그냥 전달해주시면 됩니다.
이 간단한걸 얼마나 찾았던지 ㄷㄷㄷㄷㄷㄷㄷ
아래와 같은 형식이군요


int cppLibWrap::DLL_ReadISCE(System::String^ isceFilePath, byte[] p)
{
        return m_wrapper->DLL_ReadISCE(isceFilePath, p);
}

나머지는 이제 모두 응용입니다.



댓글

이 블로그의 인기 게시물

c# GDI+ 꺼져!! BufferedGraphics

c# string 에서 mfc의 LPCTSTR간의 변환