Interop with Native 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 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; [DllImport("user32.dll")] static extern int MessageBox(int hWnd, string text, string caption, int type);
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
to null-terminated arrays of characters using one-byte ANSI
characters under Win9x or two-byte Unicode characters under
WinNT/Win2K.
Marshaling Common Types
The
CLR marshaler is a .NET facility that
knows about the core types used by COM and the Windows API and
provides default translations to CLR types for you. The
bool
type, for instance, can be translated into a
two-byte Windows BOOL
type or a four-byte
Boolean
type. You can override a default
translation using the MarshalAs
attribute:
using System.Runtime.InteropServices; static extern int Foo([MarshalAs(UnmanagedType.LPStr)] ...
Get C# Essentials now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.