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:
Posting Komentar