网站建设需要版块,重庆门户网站开发报价,工商银行手机银行app下载,十大网游人气排行榜函数指针搞C的人应该都知道#xff0c;效率高#xff0c;易用性强#xff0c;隐蔽代码等。在C里面调用C写的dll的函数指针那是在容易不过了。使用C#就稍微麻烦点了#xff01;那怎么掉呢#xff1f;通过上面的第一篇文章我们知道应该使用委托 delegate。如果再高级点…函数指针搞C的人应该都知道效率高易用性强隐蔽代码等。在C里面调用C写的dll的函数指针那是在容易不过了。使用C#就稍微麻烦点了那怎么掉呢通过上面的第一篇文章我们知道应该使用委托 delegate。如果再高级点定义一个函数指针结构有点像linux的内核也同样可以用C#调用。 提示委托就和C中的函数指针一样 借用一下别人的列子在C的一个标准Win32 api 库ccLic.dll中有一个函数void* WINAPI GetFunctionAddress(unsigned int sn);此函数通过传sn序号得到函数指针即一个函数的地址.之后再通过返回回来的地址进行其它函数的调用 那么我们必须知道.一个sn号对应的函数结构如 sn1 - bool WINAPI CCAskServerLicenseInfo(const char* server_address,unsigned short port,PCcLic_Info plicenseinfo) 在其中 typedef struct _CcLic_Info { char ower[64]; unsigned short manage_ip; unsigned short ramained_ip; unsigned short useable_time; unsigned char type; } CcLic_Info,*PCcLic_Info; 此列的目的就是通过C#调用 CCAskServerLicenseInfo 函数. [DllImport(ccLic.dll)] public static extern System.IntPtr Matrix(System.UInt32 sn);//声名入口函数 //定义函数指针模型 public delegate System.Int32 CCAskServerLicenseInfoHandle(System.String servername, System.UInt16 port, System.IntPtr ptr); public static LicenseInfo GetLicentInfo(String server, System.UInt16 port) { System.IntPtr fPtr Matrix(1);//获得CCAskServerLicenseInfo地址 CCAskServerLicenseInfoHandle CCAskServerLicenseInfo Marshal.GetDelegateForFunctionPointer(fPtr, typeof(CCAskServerLicenseInfoHandle)) as CCAskServerLicenseInfoHandle;//将地址转换为C#中的函数指针 LicenseInfo info new LicenseInfo();//声名结构并初始化 IntPtr infoPtr Marshal.AllocCoTaskMem(Marshal.SizeOf(info));//将结构体转换为指针 CCAskServerLicenseInfo(server, port, infoPtr);//调用函数 info (LicenseInfo)Marshal.PtrToStructure(infoPtr, typeof(LicenseInfo));//将指针转换为结构体 return info; } [StructLayout(LayoutKind.Sequential, CharSet CharSet.Ansi)] public struct LicenseInfo { [MarshalAs(UnmanagedType.ByValArray, SizeConst 64)] public System.Char[] ower; public System.UInt16 manage_ip; public System.UInt16 ramained_ip; public System.UInt16 useable_time; public System.Byte type; } 正好项目有个Mobile需要调用,需要用此方式,我试试看行不行. 转载于:https://www.cnblogs.com/qhonge/archive/2008/10/06/1304461.html