posted by 방랑군 2012. 1. 21. 22:31
 C#에서는 현재 응용프로그램이 실행중인 운영 체제에 있는 DLL의 함수를 플랫폼 호출(platform invoke)이라는 런타임 기능을 통해 호출할 수 있다.
  단순히 DllImport 어트리뷰트를 사용하여 DLL을 불러오면 된다.

MSDN



  다음 예제는 Win32API의 MessageBoxA함수를 사용하기 위해서 Windows DLL을 불러오는 간단한 콘솔 응용 프로그램이다. (물론 .NET의 System.Windows.Forms 네임스페이스에 MessageBox 클래스가 존재하고 이 것을 통해 활성화-Show-하는 방법이 존재한다.)

예제소스


  위의 응용 프로그램을 실행한 결과는 다음 그림에서 볼 수 있다.

.NET 런타임은 관리되는(managed) C# 코드에서 원본 DLL 함수까지 파라미터를 정렬시킨다. 그리고 MessageBox와 같은 메크로가 아닌 MessageBoxA나 MessageBoxW와 같은 실제 함수를 사용해야만 한다.

MSDN



  마지막으로 DllImport 어트리뷰트는 몇 가지 파라미터가 더 포함되어 있다.

DllImport 매개 변수


  런타임 시 관리되는(managed)코드에서 비관리(unmanaged) 코드까지 구조체를 올바르게 정렬시키려면 구조체 정의에 덧붙여 어트리뷰트를 선언해야 한다. 예를 들어, SystemTime구조체를 파라미터로 취하는 Win32 API 함수인 GetLocalTime을 선언할 수도 있다.

예제소스



 올바르게 정렬되는 구조체 파라미터의 경우에는 데이터가 선언된 대로 정확하게 정렬하는 것을 지정하는 StructLayout 어트리뷰트와 함께 선언해야 한다이런 방법을 사용하지 않는다면 데이터는 올바르게 정렬되지 않고 응용 프로그램은 오류가 발생할 것이다.

접기

        [StructLayout(LayoutKind.Sequential)]
        public class SystemTime {
            public ushort wYear;
            public ushort wMonth;
            public ushort wDayOfWeek;
            public ushort wDay;
            public ushort wHour;
            public ushort wMinute;
            public ushort wSecond;
            public ushort wMilliseconds;
        }

접기


다음과 같이 함수를 호출해 보자.

접기

        static void Main(string[] args)
        {
            SystemTime st = new SystemTime();
            GetLocalTime(st);
            string s = string.Format("date: {0}-{1}-{2}", st.wMonth, st.wDay, st.wYear);
            MessageBox(0, s, "Now", 0);                        
        }

접기



  위의 코드를 실행하면 다음 그림과 같은 대화 상자가 나타난다.



  또한 Win32 API 및 C 스타일 함수에서 사용되는 데이터 형식에 대하여 관리 코드에서 사용하는 .NET Framework 기본 제공 값 형식 또는 클래스로 대치 시켜 줘야 한다. 그에 대한 내용은 다음 링크를 참조! ^^
2009/07/06 - [Programming/C#] - 플랫폼 호출 데이터 형식



참고문헌: Inside C#

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

_문자열 마샬링  (0) 2012.01.21
_플랫폼 호출 데이터 형식  (0) 2012.01.21
16진수 문자열 변환  (0) 2012.01.21
VB.NET and C# 의 비교문서  (0) 2012.01.21
C# 으로 만든 DLL asp에서 사용  (0) 2012.01.21