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
:

재밌는걸 봐서 올려본다


http://stackoverflow.com/questions/541954/how-would-you-count-occurrences-of-a-string-within-a-string?rq=1


문자열 내에서 특정 문자를 찾는 방식인데 질문자가 올린 방식이 참 독특하게 느껴졌다.

그리고 그 방식이 오히려 이전에 떠돌던 방식보다 더 빠르다니... (베스트 답변 참고)


그러나 가장 빠른 방식은 문자 하나하나를 일일히 비교하는 것이라는 결과를 보니

역시 단순한게 짱이구나 싶기도 하다

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

C# GC 빈도 낮추기  (0) 2013.12.20
c# - c dll 디버깅시 주의할 점  (0) 2013.12.20
C# 타이머 사용 예제  (0) 2013.12.10
C#에서 User Control 만들기  (0) 2013.11.12
c#에서 SQLite 한글 사용하기 -2-  (0) 2013.11.05
Posted by Vermond
:

Visual Studio 2010에서 작성되었다

TimerSample.7z


위 프로젝트가 열리지 않을 경우 이 파일만 참고해도 무방하다

Form1.cs



C#에서 Timer는 3가지 종류가 있다


System.Windows.Forms.Timer

System.Threading.Timer

System.Timers.Timer


이 예제에서는 각각의 타이머에 대한 간략한 예제가 작성되어 있다

예제는 아주 간단해서 코드보다 주석이 더 길다


첫번째와 세번째 타이머는 비슷하고 두번째는 동작방식이 약간 다르다


각 타이머에 대한 차이 혹은 설명은 아래를 참고하도록 한다

http://msdn.microsoft.com/en-us/magazine/cc164015.aspx (영어)

http://blog.daum.net/starkcb/117



간략하게 사용 용도를 설명한다면

첫번째 타이머는 간략하게 수행할 작업에 적합하며, 별다른 조취 없이 UI 쓰레드에 접근할 수 있기 때문에 편리하다.

그러나 많이 계산해야 되는 경우라면 사용하지 않는 편이 좋은데, 오랜 시간 동작한다면 그동안 UI가 먹통이 된다

(자세한 내용은 위 링크를 참고하도록 한다)


두번째 타이머는 UI 쓰레드와 다른 쓰레드에서 동작하기 때문에 UI가 먹통이 된다거나 하지는 않는다

그렇다면 단순히 쓰레드를 사용해도 되지 않느냐고 물을 수 있지만, 반복 작업에는 쓰레드 내부에 코드로 작성하는 것보다 이쪽이 훨씬 편리하다.

만약 반복 작업이 특정한 시간마다 이루어져야 된다면 이 타이머를 사용하는게 훨씬 간편하면서도 확실하다


세번째 타이머는 첫번째와 비슷하지만 시간 정확도가 훨씬 높다.

보다 정확하게 실행되어야 한다면 이 타이머를 사용하는 것이 좋다

이 타이머는 UI 쓰레드에서 실행될수도 있고 다른 쓰레드로 실행될 수도 있기 때문에 코드 안전성을 위한다면 UI 접근 코드는 invoke-delegate를 사용해주는 편이 좋다

Posted by Vermond
: