尝试着在C#下调用以前Delphi写的一些DLL,基本实现动态调用,传入回调函数,及调用带结构数组指针作为参数的函数.
虽然DllImport可以方便的静态调用DLL的函数,但在.net2.0中新增加了一个Marshal.GetDelegateForFunctionPointer 方法,可以将非托管函数指针转换为委托。 有了这个方法就可以用三个Windows API函数即:Loadlibrary,GetProcAddress和Freelibrary来实现动态调用DLL了.下面是实现DLL动态调用的静态类
/**/ /****************************(如转载,请保留版权信息)************************ author:awin e-mail:mrzwin@21cn.com blog: http://blog.csdn.net/awin *****************************(如转载,请保留版权信息)************************/ using System; using System.Runtime.InteropServices; namespace Awin.Common ... { /**//// <summary> /// DLL加载类 /// </summary> internal class DllLoader ...{ [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); public 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 int m_hDLL = 0 ; // DLL句柄 private delegate int ShowForm(IntPtr aHandle); private ShowForm m_ShowForm; private const string DLLNAEM = " XXX.dll " ;m_hDLL = DllLoader.LoadLibrary(DLLNAEM); if (m_hDLL == 0 ) ... { MessageBox.Show("加载失败!"); return;} m_ShowForm = (ShowForm) DllLoader.GetAddress(m_hPacsview, " ShowForm " , typeof (ShowForm)); // 使用ShowForm if (m_ShowForm != null ) m_ShowForm(iHandle); // 卸载DLL DllLoader.FreeLibrary(m_hDLL);
下一篇再说说调用带结构数组指针作为参数的函数