Dynamic loading and unloading of unmanaged C# with Example



Dynamic loading and unloading of unmanaged C# with Example

DLLs 
When using the DllImport attribute you have to know the correct dll and method name at compile time. If you want 
to be more flexible and decide at runtime which dll and methods to load, you can use the Windows API methods 
LoadLibrary(), GetProcAddress() and FreeLibrary(). This can be helpful if the library to use depends on runtime 
 

conditions. 
The pointer returned by GetProcAddress() can be casted into a delegate using 
Marshal.GetDelegateForFunctionPointer(). 
The following code sample demonstrates this with the myDLL.dll from the previous examples: 
class Program 
{ 
// import necessary API as shown in other examples 
[DllImport("kernel32.dll", SetLastError = true)] 
public static extern IntPtr LoadLibrary(string lib); 
[DllImport("kernel32.dll", SetLastError = true)] 
public static extern void FreeLibrary(IntPtr module); 
[DllImport("kernel32.dll", SetLastError = true)] 
public static extern IntPtr GetProcAddress(IntPtr module, string proc); 
// declare a delegate with the required signature 
private delegate int AddDelegate(int a, int b); 
private static void Main() 
{ 
// load the dll 
IntPtr module = LoadLibrary("myDLL.dll"); 
if (module == IntPtr.Zero) // error handling 
{ 
Console.WriteLine($"Could not load library: {Marshal.GetLastWin32Error()}"); 
return; 
} 
// get a "pointer" to the method 
IntPtr method = GetProcAddress(module, "add"); 
if (method == IntPtr.Zero) // error handling 
{ 
Console.WriteLine($"Could not load method: {Marshal.GetLastWin32Error()}"); 
FreeLibrary(module); // unload library 
return; 
} 
// convert "pointer" to delegate 
AddDelegate add = (AddDelegate)Marshal.GetDelegateForFunctionPointer(method, 
typeof(AddDelegate)); 
// use function 
int result = add(750, 300); 
// unload library 
FreeLibrary(module); 
} 
} 

0 Comment's

Comment Form