积木首页 | 500多种网页特效 | 函数手册 | 广播电台 | 高清晰图片素材 | 服务器合租 | 万年历 | 网友最新浏览记录
程序开发 网页设计 搜索引擎 特效代码 操作系统 防范病毒 黑客技术 图形图象 电脑硬件 网络技术 服 务 器 数 据 库 网文精粹
您的位置:积木首页 >> 程序开发频道 >> .NET >> 正文:
标题:在C#中动态调用native dll的导出函数
时间:2006-7-31 来源:酷网动力 浏览数:
     在 C++ 中我们能够通过 LoadLibrary, GetProcAddress 来动态调用 dll 的导出函数.
  
    在 C# 中也能够用这样的方式吗?
  
    在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数,Marshal.GetDelegateForFunctionPointer 方法。此方法在 .net Framework 2.0 版中是新增的。
  
    将非托管函数指针转换为委托。
  
    实例代码如下:
  
  public delegate int MsgBox(int hwnd,string msg,string cpp,int ok);
  
  [DllImport("Kernel32")]
  public static extern int GetProcAddress(int handle, String funcname);
  [DllImport("Kernel32")]
  public static extern int LoadLibrary(String funcname);
  [DllImport("Kernel32")]
  public static extern int FreeLibrary(int handle);
  
  private static Delegate GetAddress(int dllModule, string functionname, Type t)
  {
   int addr = GetProcAddress(dllModule, functionname);
   if (addr == 0)
    return null;
   else
    return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);
  }
  
  private void button1_Click(object sender, EventArgs e)
  {
   int huser32 = 0;
   huser32 = LoadLibrary("user32.dll");
   MsgBox mymsg = (MsgBox)GetAddress(huser32, "MessageBoxA", typeof(MsgBox));
   mymsg(this.Handle.ToInt32(), txtmsg.Text, txttitle.Text , 64);
   FreeLibrary(huser32);
  }
  
  
    


(责任编辑:笑虎)
关于本站 | 广告服务 | 联系我们 | 版权申明 | 强强联盟 | 投稿热线 | 网站地图 | 申请链接
Copyright ©2005-2006 Gimoo.net All rights reserved. 积木网 版权所有
E-mail:gimoohr@gmail.com 京ICP备05050695号