C# 如何跨平台调用C++的函数指针

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C# 如何跨平台调用C++的函数指针!

函数指针搞C++的人应该都知道,效率高,易用性强,隐蔽代码等。在C++里面调用C++写的dll的函数指针那是在容易不过了。使用C#就稍微麻烦点了!那怎么掉呢?通过上面的第一篇文章我们知道应该使用委托 delegate。如果再高级点,定义一个函数指针结构(有点像linux的内核),也同样可以用C#调用。

提示:委托就和C++中的函数指针一样

借用一下别人的列子:在C++的一个标准Win32 api 库ccLic.dll中有一个函数void* WINAPI GetFunctionAddress(unsigned int sn);此函数通过传sn序号得到函数指针即一个函数的地址.之后再通过返回回来的地址进行其它函数的调用那么我们必须知道.一个sn号对应的函数结构如 sn=1 -> 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(Syste m.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 = Mar shal.GetDelegateForFunctionPointer(fPtr, typeof(CCAskServerLicenseInfoH andle)) as CCAskServerLicenseInfoHandle;//将地址转换为C#中的函数指针 LicenseInfo info = new LicenseInfo();//声名结构并初始化

IntPtr infoPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(info));//将结构体转换为指针

CCAskServerLicenseInfo(server, port, infoPtr);//调用函数

info = (LicenseInfo)Marshal.PtrToStructure(infoPtr, typeof(License Info));//将指针转换为结构体

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需要调用,需要用此方式,我试试看行不行.

相关文档
最新文档