c# 에서 C++ dll 사용하기
C#에서 C++로 제작된 DLL을 사용하기 위한방법은 제가 아는건 크게 2가지 입니다.
1. DllImport 를 사용하는 방법
아마 대부분의 dll을 호출하는 방법이 DllImport 일것입니다... 이부분은 워낙 자료가 많으니 패쓰
2. Wrapper를 이용하여 Wrapping하는 방법
CLR을 이용하여 래핑하는 방법입니다. 물론 C++을 할줄 알아야 하는거구요..
저는 단순히 기본적인 래핑법만 소개하겠습니다.
우선 비쥬얼 스튜디오를 실행합니다.
프로젝트를 VC++의 CLR을 선택합니다.
위와 같이 프로젝트를 만들어 줍니다..
그리고 프로젝트에 래핑항 라이브러리를 import 해주시고..
그리고 프로젝트에 래핑항 라이브러리를 import 해주시고..
(예전에 쓴글이라 그래요.. 지금은 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);
}
{
return m_wrapper->DLL_ReadISCE(isceFilePath, p);
}
나머지는 이제 모두 응용입니다.
댓글
댓글 쓰기