17.1 Calling Into DLLs
PInvoke, short for Platform Invocation
Services, lets C# access functions, structs, and callbacks in
unmanaged DLLs. For example, perhaps you wish to call the
MessageBox function in the Windows DLL
user32.dll:
int MessageBox(HWND hWnd, LPCTSTR lpText,
LPCTSTR lpCation, UINT uType);
To call this function, you can write a static
extern method decorated with the
DllImport attribute:
using System.Runtime.InteropServices;
class MsgBoxTest {
[DllImport("user32.dll")]
static extern int MessageBox(int hWnd, string text,
string caption, int type);
public static void Main( ) {
MessageBox(0, "Please do not press this button again.",
"Attention", 0);
}
}
PInvoke then finds and loads the required Win32 DLLs and resolves the
entry point of the requested function. The CLR includes a marshaler
that knows how to convert parameters and return values between .NET
types and unmanaged types. In this example the int
parameters translate directly to four-byte integers that the function
expects, and the string parameters are converted into null-terminated
arrays of characters using one-byte ANSI characters under Win9x, or
into two-byte Unicode characters under WinNT/Win2K.
|