函数指针搞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(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

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

  1. ios 调用c语言函数指针,第09天C语言(08):指向函数的指针的应用场景

    #pragma mark 指向函数的指针的应用场景 ###pragma mark 概念 ###pragma mark 代码 #include int sum(int v1,int v2) { retu ...

  2. 指针--用指针变量作函数参数的实例(按值调用与模拟按引用调用)、函数指针及其应用

    一.用指针变量作函数参数的实例 思考题: 例题:从键盘输入某班学生某门课成绩(每班人数最多不超过40人,具体人数由键盘输入),是分析下列程序是否能实现计算并输出最高分以及相应学号. #include ...

  3. 类的成员函数指针和静态成员函数指针 调用成员函数***

    C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...

  4. C语言中的函数指针、函数的直接/间接调用、C# 委托(自定义委托、内置泛型委托、委托的实例化、委托的一般使用(模板方法、回调方法)、泛型委托、多播委托、同步/异步使用委托)

    文章目录 C语言中的函数指针 函数的直接调用与间接调用 Java中没有与委托对应的功能实体 C# 委托 C# 自定义委托类型 C# 内置泛型委托类型 委托的实例化 委托也支持泛型的使用 委托的一般使用 ...

  5. 恼人的函数指针(二)

    原文链接:http://www.cnblogs.com/AnnieKim/archive/2011/12/04/2275589.html 前面曾写过一篇恼人的函数指针(一).总结了普通函数指针的声明. ...

  6. (转)函数指针,指针函数,指向函数的指针,返回指针的函数

    摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...

  7. 成员函数指针与高性能的C++委托

    成员函数指针与高性能的C++委托 http://www.cnblogs.com/jans2002/archive/2006/10/13/528160.html Member Function Poin ...

  8. C++函数指针使用总结

    一 函数指针介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关.举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为int ...

  9. 成员函数指针与高性能的C++委托(中篇)

    成员函数指针与高性能的C++委托(中篇) 撰文:Don Clugston (接上篇) 成员函数指针--为什么那么复杂? 类的成员函数和标准的C函数有一些不同.与被显式声明的参数相似,类的成员函数有一个 ...

最新文章

  1. 基于OpenCV实现口罩识别
  2. 电磁干扰滤波器的设计
  3. maven_使用Maven将文件上传和下载到S3
  4. 【机器学习】解决中小微企业的信贷决策问题(一)
  5. 设计模式:单例模式之饿汉式
  6. OpenGL着色器创建一个星系由颗粒制成
  7. Filter_细节_过滤器拦截路径配置
  8. 从钱龙数据中读取股票权息信息导入到数据库
  9. 流量专家为114搜索提供权威流量访问统计
  10. rust 案例_RUST-X气相防锈产品落户中国,助力中国高端制造出口海外
  11. 虚拟化服务器内存,服务器内存设置虚拟化
  12. 一款猥琐的PHP后门分析
  13. python生日快乐代码简单_Python编程代码:当你的亲人朋友生日时,给他运行这个程序,生日快乐弹窗!...
  14. Maven的基本使用操作
  15. 回归分析-常用统计量含义解析
  16. Mac 破解zip压缩文件密码详解
  17. Building Coder(Revit 二次开发) - 空闲事件(Idling Event)增强和外部事件(External Event)
  18. 51单片机IIC通信协议
  19. 物联网毕业设计 单片机智能扫地机器人设计与实现
  20. 态度篇·与其混不如滚

热门文章

  1. Linux中拷贝和移动文件
  2. Windows内核函数
  3. 20145219 《信息安全系统设计基础》第01周学习总结
  4. android listview使用自定义的adapter没有了OnItemClickListener事件解决办法
  5. exec导入 php,PHP exec运行一个文件
  6. altera fpga 型号说明_A/X家FPGA架构及资源评估
  7. ps法线贴图插件_法线与置换贴图原理讲解以及烘焙制作!
  8. 微小宝公众号排行榜_排行榜 | 山西省高校、高职中专微信公众号周数据排行榜...
  9. mac php gd库,mac下安装GD库FreeType
  10. 两个常数的卷积为多少_卷积(Convolution)与好核函数(Good Kernel)