迷你5207专属论坛

注册

 

发新话题 回复该主题

[DotNet] C#中实现动态加载dll库 [复制链接]

发表者
C#中要使用动态链接库中的导出函数,只能在程序中根据DllAtribute显示调用,无法在运行阶段动态加载,但是我们可以利用WIN32 API的LoadLibrary和FreeLibrary打到目的,问题是根据GetProcAddress()函数获取到的导出函数的地址无法在C#中利用,网上很多方法多是利用对函数调用栈的操作来达到在C#中操作的目的.    其实如果导出函数没有返回值,完全可以利用另一个API函数达到动态绑定DLL库的目的:
  1. LRESULT CallWindowProc( WNDPROC lpPrevWndFunc,
  2.     HWND hWnd,
  3.     UINT Msg,
  4.     WPARAM wParam,
  5.     LPARAM lParam
  6. );
复制代码
如果导出函数无形参也无返回值的话,可以直接调用CallWindowProc(FunctionName,0,0,0,0),如果我们需要向导出函数传递简单参数的话,也可以自定义一个消息,用消息封装实参。

  1. [DllImport("kernel32")]
  2. public extern static int LoadLibrary(string lpLibFileName);
  3. [DllImport("kernel32")]
  4. public extern static bool FreeLibrary(int hLibModule);
  5. [DllImport("kernel32", CharSet=CharSet.Ansi)]
  6. public extern static int GetProcAddress(int hModule, string lpProcName);
  7. [DllImport("user32", EntryPoint="CallWindowProc")]
  8. public static extern int CallWindowProc(int lpPrevWndFunc, int hwnd, int MSG, int wParam, int lParam);

  9. private void button1_Click(object sender, System.EventArgs e)
  10. {
  11. int hmod=LoadLibrary("*****.dll");
  12. int pFname=GetProcAddress(hmod, "*****");
  13. CallWindowProc(pFname,0,0,0);
  14. FreeLibrary(hmod);
  15. }
复制代码
转至::http://blog.csdn.net/hailongchang/archive/2006/12/12/1439502.aspx
本主题由 管理员 5207 于 2007-12-2 11:15:36 执行 主题分类 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
发新话题 回复该主题