Program/C#
C# Dll Load
TJStory
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로 설정하였습니다.
이 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로 설정하였습니다.
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); } } |