'dll'에 해당되는 글 1건

  1. 2013.12.24 C DLL과 C# 연결 방법

 C#에서 c dll 함수를 호출하는 방법은 간단하다. 인자가 int, float 등의 형식이면 c#에서 그에 대응되는 값을 넣어주면 된다. 보통은 같은 명칭을 사용하며, unsigned int 같은 경우만 uint로 바꿔준다.

 문제는 포인터를 사용할 경우다. c#에서는 기본적으로 포인터를 사용할 수 없다. 그러나 c에서 배열을 사용하려면 포인터는 필수이다. 포인터를 사용할 수 있는 방법은 대략 3가지 정도가 있다.


1. 직접 포인터 선언해서 사용

c#에서도 제한적이지만 포인터를 직접 선언해서 사용할 수 있다. 포인터를 사용하려면 다음의 조건이 필요하다


- 포인터를 선언한 함수 혹은 클래스 상에 unsafe를 추가한다. 혹은 unsafe 블록을 생성한다. 포인터는 unsafe 내부에서만 사용 가능하다.

- 빌드 옵션에서 [안전하지 않은 코드 허용]을 체크한다. unsafe 사용시 이 옵션을 켜지 않으면 빌드되지 않는다





2. 그냥 사용 (마샬링)

대충 넘겨줘도 닷넷이 알아서 변환해주는 아주 간편한 기능이다

쓰기는 안되니 쓰기가 필요하다면 1번 방식을 사용하거나 텍스트로 데이터를 넘기도록 한다





3. IntPtr 사용

c#에서 포인터로 사용되는 놈이다. 2차원 이상의 배열을 넘겨줘야 한다면 이쪽이 가장 확실한 것으로 생각된다


예제는 아래의 링크로 대신한다 (베스트 답변 참고)

http://stackoverflow.com/questions/537573/how-to-get-intptr-from-byte-in-c-sharp




개인적으로 볼때 적합한 사용 방식은

1. 1차원 이하의 인자 전달만 필요하면 2번(마샬링)을 사용하여 편하게 작업한다

2. 2차원 이상의 인자 전달 혹은 한글 등을 제대로 전달해야 할때는 3번(IntPtr)을 사용한다

3. 포인터로 쓰기가 필요한 경우 직접 포인터를 작성하여 사용한다



아래 첨부된 파일은 간략한 예제 파일이다 (Visual Studio 2010에서 작성되었다)

버튼1 이벤트 : 직접 포인터 사용

버튼2 이벤트 : 마샬링 사용

버튼3 이벤트 : IntPtr 사용 (double 2중 배열)

버튼4 이벤트 : IntPtr 사용 (문자열 배열)


testDllCheck.7z


'Programming > C#' 카테고리의 다른 글

PropertyGrid 사용방법  (0) 2014.01.06
C# GC 빈도 낮추기  (0) 2013.12.20
c# - c dll 디버깅시 주의할 점  (0) 2013.12.20
c# 문자열에서 문자 개수 알아내기  (0) 2013.12.19
C# 타이머 사용 예제  (0) 2013.12.10
Posted by Vermond
: