65.9K
CodeProject is changing. Read more.
Home

Dynamic Invoke from Unmanaged DLL

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.44/5 (9 votes)

Jan 4, 2005

viewsIcon

92964

downloadIcon

1

This article explains invoking unmanaged DLL functions from C#.

Introduction

This article demonstrates how to call an unmanaged MFC DLL function from a C# code. Code uses Reflection namespace. To use code snippets below, you must add the following:

using System.Reflection.Emit;
using System.Reflection;

Imagine you have an MFC DLL (getmyversion.dll) with function named int GetDllversion(char* verstr) which returns your DLL's version in verstr.

The below function creates a dynamic assembly object. And DefinePInvokeMethod method creates a method which we will use to access our DLL function. To complete our global ops for our dynamic module, call CreateGlobalFunctions. Using GetMethod function of our previously created method, we can invoke our MFC DLL function.

public  object DynamicDllFunctionInvoke( string DllPath, string EntryPoint ) 
  {
   // Version string definition
   byte[] verstr = new byte[1024];
   //Define return type of your dll function.
   Type returnType = typeof(int);        
   //out or in parameters of your function.   
   Type [] parameterTypes = {typeof(byte[])};
   object[] parameterValues = {verstr};
   string entryPoint = entrypoint;
              
   // Create a dynamic assembly and a dynamic module
   AssemblyName asmName = new AssemblyName();
   asmName.Name = "tempDll";
   AssemblyBuilder dynamicAsm = 
     AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, 
     AssemblyBuilderAccess.Run);
   ModuleBuilder dynamicMod = 
     dynamicAsm.DefineDynamicModule("tempModule");

   // Dynamically construct a global PInvoke signature 
   // using the input information
   MethodBuilder dynamicMethod = dynamicMod.DefinePInvokeMethod(
     entryPoint, DllPath, MethodAttributes.Static | MethodAttributes.Public
     | MethodAttributes.PinvokeImpl , CallingConventions.Standard,
     returnType, parameterTypes, CallingConvention.Winapi, 
     CharSet.Ansi);

   // This global method is now complete
   dynamicMod.CreateGlobalFunctions();

   // Get a MethodInfo for the PInvoke method
   MethodInfo mi = dynamicMod.GetMethod(EntryPoint);
   // Invoke the static method and return whatever it returns
   object retval = mi.Invoke(null, parameterValues);
   // Filled verstr paramter.
   MessageBox.Show(System.Text.ASCIIEncoding.ASCII.GetString(verstr));
   return retval;
  }

Sample calling of the method is as below:

DynamicDllFunctionInvoke(@"c:\getmyversion.dll","GetDllVersion");