C# Dll Load

Program/C# 2008. 1. 17. 16:20
NET Platform 에서  기존의 WIn32에 있는 함수등을 사용하는 Platform Invoke는 metadata에서 수행할 수 있습니다.
이 metadata에는 exported된 함수와 런타임시에 값을 전달할 수 있습니다. 다음 그림을 한번 보시기 바랍니다.


Platform Invoke는 unmanaged된 DLL함수를 호출하고 있습니다.


사용자 삽입 이미지

 



Platform invoke가 unmanaged된 DLL함수를 호출하려면 다음과 같은 과정을 거칩니다.

1. 그 함수를 포함하고 있는 DLL을 지정합니다.
2. 메모리에 DLL을 호출합니다.
3. 메모리에 있는 함수의 어드레스를 지정하고 함수를 호출하기 위해 필요한 값을 전달합니다.
4. unmanaged 함수로 제어권을 넘김니다.

* DLL을 로드하고 지정하는 것은 함수 호출이 처음에 발생할때만 설정하면 됩니다.
* Platform invoke에서는 exception 처리를 unmanaged 함수에 의해서 managed 로 전달합니다.


다음 예제는 argument로 문자열을 넘겨서 User32.dll 에 있는 메세지박스를 호출하고 정의하는 예제입니다.
이 예제에서 CharSet는 String과 문자열 길이를 정의하기 위해서 Auto로 설정하였습니다.

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

using System;
using System.Runtime.InteropServices;

public class Win32
{
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern int MessageBox(int hWnd, String text, string caption, uint type);
}

public class HelloWorld
{
    public static void Main() 
    {
       Win32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);
    }
}     
: