C++ Dll 만들어서 C#에서 사용하기 (마샬링) [C++]

개발 노트/C 언어  2012.09.23 22:14

안녕하세요. 명월입니다.
이번 포스트는 C++의 Dll을 만들어 C#에서 사용하는 방법에 대한 내용입니다.


마샬링에 대한 내용은 이전에 공부했던 어트리뷰트가 포함되어있습니다.

링크 - 어튜리뷰트 - (Atturibute) [C#]


우리가 C#으로 프로그램을 만들 때는 .net Framwork 기반으로 개발합니다. 그래서 C#에서 Framework를 벗어나서 개발할 수가 없습니다. 예를 들면 후크에 대해서 MSDN을 살펴보면 C#은 전역후크(Window API)를 지원 하지 않으니 Com+ 를 사용하라고 되어있습니다.(링크를 찾아보려 했는데 나오지 않네요.)
이럴 때는 C++의 WindowApi를 가져와서 사용할 수가 있겠네요.


또, C++에서 C#으로 업그레이드를 할 경우, C++의 모듈을 몽땅 버리고 처음부터 다시 개발하는 것이 아니고 C++의 라이브러리는 그대로 가져와서 사용하는 때도 있습니다.



먼저, C++의 DLL을 작성하겠습니다.

(저는 Visual Studio 2010의 C++ 기본 설정이 달라서 2008에서 작성하였습니다. 2010에서 사용해도 다른 점이 없습니다.)









여기서 잠깐 살펴보고 갈 내용은 C++ 과 C#은 대부분의 자료형은 같습니다. 그러나 C++를 자료형이 없으므로 약간의 형 변환이 필요합니다. String을 받을 때는 포인터로 이용한 동적 배열로 받아들리면 되겠습니다.

Return을 할 때는 LPCSTR(Long Pointer Char String) 형으로 반환을 하면 되겠습니다.


다음은 C# 코드의 마샬링 부분이겠습니다.




어튜리뷰트로 해당 라이브러리를 취득해오고 해당 함수을 선언합니다.
String의 부분은 체크를 해야 하는데(C++은 String이 없습니다.) C++에서의 포인터로 String값을 받는 부분은 char배열(메모리 배멸)로 넘깁니다.
문제는 LPCSTR 부분인데 String도 클래스이기는 하지만 파라미터로 참조형식으로 받을 수가 없기 때문에 Stringbuilder클래스로 받아와야 합니다.



C++로 작성한 Dll를 복사해 넣겠습니다.




예제 파일 첨부합니다.


Dll_20120923[0].zip Dll_20120923[1].zip


댓글 2개가 달렸습니다.
댓글쓰기
  1. 이코스타
    2013.01.16 15:37 신고 |  수정/삭제  댓글쓰기

    이거 압축 풀면 원래 [0], [1] 두개 생기는건가요?
    DLL 임포트는 어디다 하신거에요?
    제가 VS2012 익스프레스를 쓰는데요, 첨부하신 [1] 파일 압축을풀고, 솔루션 실행하면 VS2012에서 잘 돌아갑니다.
    그런데 dll파일을 찾아보면.. project/bin/debug 폴더에 있는걸 확인할 수 있는데요...
    실행파일 위치에서 dll을 링크거는건가요?
    프로젝트에서 "참조추가" 이런 메뉴 이용해서 추가해야 하는거 아닌가요??

    프로젝트에 dll 추가하는법좀 알려주세요!!

    • 明月 v명월v
      2013.01.20 21:06 신고 |  수정/삭제

      안녕하세요..
      이 샘플소스는 C++, C# 소스 두개 입니다.
      이 예제는 C#에서 DLL를 Import 하는 것이 아니고..
      C++ Dll 을 C#에서 Import 하는 내용입니다..

      같은 C# 코드라고 하면 그냥 참조 추가해서 사용하겠지요..^^

      감사합니다..^^