|
在 C++ 中我们能够通过 LoadLibrary, GetProcAddress 来动态调用 dll 的导出函数. VXQLinux联盟 在 C# 中也能够用这样的方式吗? VXQLinux联盟 在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数 VXQLinux联盟 Marshal.GetDelegateForFunctionPointer 方法 VXQLinux联盟 此方法在 .NET Framework 2.0 版中是新增的。 VXQLinux联盟 VXQLinux联盟 将非托管函数指针转换为委托。 VXQLinux联盟 实例代码如下: VXQLinux联盟 VXQLinux联盟 VXQLinux联盟 public delegate int MsgBox(int hwnd,string msg,string cpp,int ok); VXQLinux联盟 VXQLinux联盟 [DllImport("Kernel32")] VXQLinux联盟 public static extern int GetProcAddress(int handle, String funcname); VXQLinux联盟 [DllImport("Kernel32")] VXQLinux联盟 public static extern int LoadLibrary(String funcname); VXQLinux联盟 [DllImport("Kernel32")] VXQLinux联盟 public static extern int FreeLibrary(int handle); VXQLinux联盟 VXQLinux联盟 private static Delegate GetAddress(int dllModule, string functionname, Type t) VXQLinux联盟 { VXQLinux联盟 int addr = GetProcAddress(dllModule, functionname); VXQLinux联盟 if (addr == 0) VXQLinux联盟 return null; VXQLinux联盟 else VXQLinux联盟 return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t); VXQLinux联盟 } VXQLinux联盟 VXQLinux联盟 private void button1_Click(object sender, EventArgs e) VXQLinux联盟 { VXQLinux联盟 int huser32 = 0; VXQLinux联盟 huser32 = LoadLibrary("user32.dll"); VXQLinux联盟 MsgBox mymsg = (MsgBox)GetAddress(huser32, "MessageBoxA", typeof(MsgBox)); VXQLinux联盟 mymsg(this.Handle.ToInt32(), txtmsg.Text, txttitle.Text , 64); VXQLinux联盟 FreeLibrary(huser32); VXQLinux联盟 } VXQLinux联盟 VXQLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|