기본 콘텐츠로 건너뛰기

라벨이 C인 게시물 표시

C# Interop - C# 과 C API 상호 운영성

C# 은 강력한 기능과 클래스들을 제공하기만 Window Application 의 작성을 위해서는 C 로 작성된 Library를 가져다 사용해야 하는 경우가 많이 발생한다. C# 은 기본적으로 포인터를 지원하지 않고, 관리되는 코드의 메모리 관리체계가 근본적으로 C와는 차이가 많기 때문에 C 와의 호환을 위해서는 특수한 기법을 사용해야 한다. 이를 위해서 제공되는 것이 C# 의 PInvoke 와 Marshalling 이다. 1. Using C DLL (PInvoke : Platform Invocation Service) C# 은 C DLL 의 관리되지 않는 코드 함수를 호출할 수 있도록 플랫폼 호출 서비스 (PInvoke)를 제공한다. 일반적으로 C 로 작성된 DLL 이나 WIN32 API 를 호출하는 용도로 사용된다. 1.1 DLL 함수의 정의 PInvoke 를 이용해서 WIN32 API를 정의하는 방법은 "DllImport" 를 이용하는 것으로 DllImportAttribute 클래스를 사용하여 특성 정의를 하면 된다. public DllImportAttribute( string dllName) 즉, 사용하려는 DLL 의 파일명을 파라미터로 지정하고 실제 사용하려는 함수는 특성의 바로 아래에 함수 선언을 하면 된다. 예) USER32.dll 의 MessageBox 함수 정의 using System.Runtime.InteropServices [DllImport(“user32”)] public static extern int MessageBox( int hWnd, String pText, String pCaption, int uType); 위의 예와 같이 선언하고 C# 코드에서 "MessageBo" 라는 이름으로 실제 함수를 호출할 수 있다. 단, 반드시 해당 함수는 "static extern" 으로 선언되어야 한다 . 1.2 Dll