Rabu, 17 Juni 2009

Memanggil DLL secara dinamic di C#

Tulisan ini menjelaskan bagaimana cara memanggil function yang terdapat pada sembarang file MFC DLL dari C# code.  Disini kita menggunakan Reflection namespace, dan untuk dapat memanfaatkannya diperlukan:

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


Misalnya kita memiliki file MFC DLL (getmyversion.dll) dengan suatu function int GetDllversion(char* verstr) yang mengeluarkan hasil berupa versi DLL yang terletak pada verstr.



Function dibawah ini membuat dynamic assembly object, dan DefinePInvokeMethod method membuat method yang akan kita gunakan untuk meng-access function DLL. Untuk melengkapi operasi pemanggilan dynamic module, panggil CreateGlobalFunctions. Menggunakan function GetMethod dari created method yang baru dibuat, kita dapat memanggil function yang ada di MFC DLL.





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;
}


Contoh pemanggilan function di atas:







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




Akhmad Daniel Sembiring

vITraining.com


Ligarwangi.com - toserba online

Tidak ada komentar: