using System;
using System.Threading;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Text;
class Program
{
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllName);
[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
delegate int MessageBoxDelegate(IntPtr hwnd,
[MarshalAs(UnmanagedType.LPWStr)]string text,
[MarshalAs(UnmanagedType.LPWStr)]string caption,
int type);
static void Main(string[] args)
{
IntPtr userApi = LoadLibrary("user32.dll");
IntPtr msgBoxAddress = GetProcAddress(userApi, "MessageBoxW"); // unicode (wide) message box
MessageBoxDelegate mbd = (MessageBoxDelegate)Marshal.GetDelegateForFunctionPointer(msgBoxAddress,typeof(MessageBoxDelegate));
mbd(IntPtr.Zero, "A", "B", 0);
DoSomething(mbd);
}
static void DoSomething(MessageBoxDelegate mbd)
{
mbd(IntPtr.Zero, "Work completed.", "Work Progress", 0);
}
}