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
:

C# GC 빈도 낮추기

Programming/C# 2013. 12. 20. 16:40 |

http://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time


채택된 답변 참고


실행될 코드는 finally 블록의 맨 첫번째에 넣어줘야 한다

try에 넣어놓으면 혹여나 예외로 catch로 빠졌을때 실행이 되지 않기 때문에

(물론 이경우는 GC 레벨이 낮아지지 않아서 중간에 GC가 실행될 것을 염두에 둬야 한다)


이 방법의 장점이라면 특정 코드 내에서 GC의 실행 빈도를 낮출 수 있다

그리고 보호할 모든 객체를 다 처리할 필요가 없다


단점은 이렇게 해도 메모리 부족해지면 GC가 수집을 수행하기 때문에 100% 막을 수는 없다는 것

프로그래머가 완벽하게 메모리 관리를 할려면 C#말고 다른걸 쓰는게 좋아 보인다

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

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

c# 프로젝트에서 디버깅 옵션의 비관리 코드 디버깅 사용

c 프로젝트에서 디버깅 - 디버거 형식을 혼압


으로 설정했을 때에 dll 디버깅이 된다.

(물론 당연하겠지만 두 프로젝트는 하나의 솔루션 내에서 열려 있어야 한다)


근데 이래도 안되는 경우가 있는데 방금 해결한 방법은 다음과 같다


- c 프로젝트 output을 dll로 설정한다

- 빌드한다

- 방금 빌드한 dll로 교체한다



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

C DLL과 C# 연결 방법  (0) 2013.12.24
C# GC 빈도 낮추기  (0) 2013.12.20
c# 문자열에서 문자 개수 알아내기  (0) 2013.12.19
C# 타이머 사용 예제  (0) 2013.12.10
C#에서 User Control 만들기  (0) 2013.11.12
Posted by Vermond
: