A következő C# kód a delegate-ek használatát mutatja be:using System.Runtime.InteropServices;
namespace TesztCsharp
{
internal class Delegates
{
static int Main(string[] args)
{
ADD add = Add;
if (add is ValueType) Console.WriteLine("Ertek tipus.\n");
else Console.WriteLine("Referencia tipus.\n");
int sum = add(2, 3);
int sum2 = Add(2, 3);
Console.WriteLine("a + b = {0}\na + b = {1}", sum, sum2);
MessageBox(0, "Tartalom", "Cím", 0);
IntPtr lib = NativeLibrary.Load("user32.dll");
IntPtr addressA = NativeLibrary.GetExport(lib, "MessageBoxA");
IntPtr addressW = NativeLibrary.GetExport(lib, "MessageBoxW");
/*
//Regebbi verziok eseten:
IntPtr lib = LoadLibrary("user32");
IntPtr addressA = GetProcAddress(lib, "MessageBoxA");
IntPtr addressW = GetProcAddress(lib, "MessageBoxW");
*/
MessageBoxA MsgBoxA = (MessageBoxA)Marshal.GetDelegateForFunctionPointer(addressA, typeof(MessageBoxA));
MessageBoxW MsgBoxW = (MessageBoxW)Marshal.GetDelegateForFunctionPointer(addressW, typeof(MessageBoxW));
MsgBoxA(0, "Tartalom_A", "Cím_A", 0);
MsgBoxW(0, "Tartalom_W", "Cím_W", 0);
/*
unsafe
{
var MsgBoxPA = (delegate* unmanaged<int, string, string, int, int>)addressA;
var MsgBoxPW = (delegate* unmanaged<int, IntPtr, IntPtr, int, int>)addressW;
MsgBoxPA(0, "Tartalom_PA", "Cím_PA", 0);
MsgBoxPW(0, Marshal.StringToHGlobalUni("Tartalom_PW"), Marshal.StringToHGlobalUni("Cím_PW"), 0);
}
*/
NativeLibrary.Free(lib);
return 0;
}
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Auto)]
static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
delegate int MessageBoxA(int hWnd, string lpText, string lpCaption, int uType);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
delegate int MessageBoxW(int hWnd, string lpText, string lpCaption, int uType);
delegate int ADD(int a, int b);
static int Add(int a, int b)
{
return a + b;
}
/*
//Regebbi verziok eseten:
[DllImport("kernel32", CharSet = CharSet.Ansi)]
extern static IntPtr GetProcAddress(IntPtr hwnd, string procedureName);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPWStr)] string lpModuleName);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllToLoad);
*/
}
}
A kimenet:Referencia tipus.
a + b = 5
a + b = 5
Mint látjuk, a delegate referencia típus. Ha az unsafe kódot használnánk, akkor engedélyezni kell a projektben. A legegyszerűbb használat ez:static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
De azért nem árt, ha a többi lehetőséggel is tisztában vagyunk.