C#总结(四)调用C++动态库

  由于公司很多底层的SDK,都是C++开发,上层的应用软件却是C# Winform程序。在实际工作的过程中,就经常碰到了C# 程序调用C++ 动态库的问题。最近一直在和C++ 打交道,C# 怎么调用C++ 类库函数。也遇到了一些问题,所以就来总结总结C#程序调用C++动态库时的各种坑。

 

  1. 可能遇到的问题:

        C#在调用动态库的过程中我也遇到了以下一些问题:

        1、C++中有指针,C#中需要使用指针吗?

        由于C++中的动态库中有指针参数,因此我也是用.NET的不安全代码,使用了C#的指针,但是也还是出现了一些问题,如在C#中传入的参数是一个二维数组时就出现了问题,最后只能改C++函数传入参数的参数类型。

        2、C#和C++中的类型如何转换呢?

        虽然C#和C++比较类似,但是其给我们的参数类型我们要与C#的参数类型一一对应起来,具体看后续说明。

        3、C++函数中的CallingConventionCharSet 怎么设置?

   调用C++函数之前一定要先确认,否则可能出现函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配的问题。函数的CallingConvention和CharSet,可以查看动态库对应的 .h头文件。

        4、如何反编译C++的dll的名称,端口?

        可以通过Dependency Walker工具进行反编译查看别人写的动态库的信息

   5、指针函数如何传参?

   对于函数需要的指针函数,C# 调用时,可以定义委托来传入参数。 

   6、需要注意C++ dll 编译的平台是x86还是x64,是多字节的还是双字节的(Unicode)。

 

  2. 通过Dependency Walke查看dll的名称,端口

  下载Dependency 后将对应的C++ dll文件加载进去,就尅看到动态库的对应的信息,同时也可以通过.h 头文件查看。

 

  3. 如何调用

  c#调用c++动态库一般我们这样写

    [DllImport(SDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]public static extern int IKSDK_Release();
 1. DllImport的第一个参数SDK是动态库dll的路径,此dll放在程序运行的根目录或者c:windows/sytem32下,建议在程序根目录创建一个子目录来放置相应的C++ 动态库文件,方便以后更新。 

  2. CallingConvention 参数是c#调用c++的方式 是个枚举 msdn解释如下:

Cdecl调用方清理堆栈。这使您能够调用具有 varargs 的函数(如 Printf),使之可用于接受可变数目的参数的方法。 
FastCal不支持此调用约定。
StdCall被调用方清理堆栈。这是使用平台 invoke 调用非托管函数的默认约定。 
ThisCall第一个参数是 this 指针,它存储在寄存器 ECX 中。其他参数被推送到堆栈上。此调用约定用于对从非托管 DLL 导出的类调用方法。 
Winapi此成员实际上不是调用约定,而是使用了默认平台调用约定。例如,在 Windows 上默认为 StdCall,在 Windows CE.NET 上默认为 Cdecl。 

  3. CharSet参数是控制名称重整以及将字符串参数封送到函数中的方式。 默认值为 CharSet.Ansi。

  4. entrypoint参数用于标识函数在 DLL 中的位置。在托管对象中,目标函数的原名或序号入口点将标识跨越交互操作边界的函数。此外,您可以将入口点映射到一个不同的名称,这实际上是将函数重命名。一般默认不设置此参数。

  5. 其他参数,请查看MSDN对于 DllImportAttribute 的说明。

  

  4. 其他说明

  C# 调用C++ 动态库,还有一个特别麻烦的问题就是参数对于的问题。后续会结合网上的资料总结一份详细的对照表。

  

 

转载于:https://www.cnblogs.com/zhangweizhong/p/8119340.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql外码内码定义_中文编码杂谈(转) - CodeAxe的个人页面 - OSCHINA - 中文开源技术交流社区...

编码问题的例子在windows自带的notepad(记事本)程序中输入“联通”两个字,保存后再次打开,会发现“联通”不见了,代之以“��ͨ”的乱码。这是windows平台上典型的中文编码问题。即文件保存的时候是按照ANSI编码(其实就…

洛谷1417烹调方案——动态规划:价值受时间影响

题目:https://www.luogu.org/problemnew/show/P1417 与01背包的不同在于价值受时间影响。 对第i个物品的遍历有一个先后顺序,在01背包里顺序不影响,但此时顺序会影响。 所以可以考虑对遍历的顺序排序。因为排序时会把每一个都和其余所有比较一…

python re.split_python re模块re.split将字符串分割后返回列表

re.splitsplit 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:re.split(pattern, string[, maxsplit0, flags0])参数:参数描述pattern匹配的正则表达式string要匹配的字符串。maxsplit分隔次数,maxsplit1 分隔一…

python自动化控制设备有限公司_华为 Python网络自动化

哈喽,大家好!我是艺博东 ,是一个思科出身、专注于华为的网工;好了,话不多说,我们直接进入正题。光棍二十年,不知道情人节是什么鬼东西。还是好好学技术吧!努力、奋斗吧!为…

vue组件 Prop传递数据

组件实例的作用域是孤立的。这意味着不能(也不应该)在子组件的模板内直接引用父组件的数据。要让子组件使用父组件的数据,我们需要通过子组件的props选项。 prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来…

Study之2 Glance相关操作-devstack

1,Glance的image是存储在backend中,backend配置在: /etc/glance/glance-api.conf。2, devstack默认:image 存放在控制节点本地目录 /opt/stack/data/glance/images/ 中。 3,查看目前已经存在的image。 source devstack…

python视图函数是什么意思_Flask初学者:视图函数

视图函数返回html模板:使用“from flask import render_template”,在函数中传入相对于文件夹“templates”html模板路径名称字符串即可,flask会自动到项目根目录的“templates”文件夹(创建flask项目时,pycharm会自动创建两个空文…

kendo Grid json解析的问题

新建立了一个 页面,在grid中使用了dropdownlist,总是显示companyId is not defined ,以前这个问题解决过了,忘记记录了额,现在不知道怎么办了 下面的这个解决方法是错误的razor语法中的renderScript移动到scrip前面去解…

人工蜂群算法python_教程 | 用人工蜂群算法求解k-分区聚类问题

原标题:教程 | 用人工蜂群算法求解k-分区聚类问题选自towarddatascience作者:Pedro Buarque参与:Pedro、刘晓坤群体智能算法是一类受生物群体智能行为的启发而发展出来的算法,社会性动物例如蚂蚁、蜜蜂、鱼等,个体的简…

不定方程求解

题目链接:http://noi.openjudge.cn/ch0201/7650/总时间限制: 1000ms 内存限制: 65536kB描述给定正整数a,b,c。求不定方程 axbyc 关于未知数x和y的所有非负整数解组数。 输入一行,包含三个正整数a,b,c&#…

依赖注入底层反射原理_PHP基于反射机制实现自动依赖注入的方法详解_php技巧...

这篇文章主要介绍了PHP基于反射机制实现自动依赖注入的方法,结合实例形式分析了php使用反射实现自动依赖注入的步骤、原理与相关操作技巧,本文实例讲述了PHP基于反射机制实现自动依赖注入的方法。分享给大家供大家参考,我们一起来看看本篇文章吧!依赖注入…

Java学习(二)

Java中的基本类型数据(char、bool、byte、short、int、long、float、double)长度: 1 System.out.println(Byte.SIZE/8);2 System.out.println(Short.SIZE/8);3 System.out.println(Integer.SIZE/8);4 System…

java遍历树_Java实现遍历N级树形目录结构

最近挺忙,一直在做项目,然后有个树形目录结构需要返回给前端,这里给大家说一下实现的思路。具体达到的效果类似:一级目录A:二级目录A:三级目录:四级目录:文件.txt二级目录B&#xff…

【Linux】【Services】【SaaS】Docker+kubernetes(11. 构建复杂的高可用网络)

1. 简介 flannel在实战阶段貌似不能胜任在灾难恢复时候异地的网络,打算用openvswith试试转载于:https://www.cnblogs.com/demonzk/p/8404103.html

java输出变量_Java笔记1: 输入输出与变量常量

输入方法nextLine以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。可以获得空白的一串字符。import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);// 从键盘接收数据System.o…

python_fullstack基础(十八)-并发编程

并发编程 一、进程 1、理论背景 ①操作系统背景 手工操作—穿孔卡片 原理:用户独占计算机,CPU等待手工操作,资源利用和CPU利用效率极低批处理—磁带处理、批处理系统 原理:主机与输入机之间增加磁带存储设备,使得计算机…

httplib java_httplib发布调用错误

我正在尝试自动化几个http请求,其中,我有以下从网络捕获的POST调用数据:方法:POST请求标头:POST /cgi-bin/auto_dispatch.cgi HTTP / 1.1主机:10.226.45.6连接:keep-alive内容长度:2…

20165218 学习基础和C语言基础调查

个人技能及阅读心得 个人技能之绘画绘画是我从很小便开始接触的,从最初的简笔画到国画、素描、水粉,大约也学了七八年。但是到了高中之后,就逐渐放下了。 记得当初学素描时,老师的一句话让我记忆犹新,她说,…

java 执行机制_Java类的执行机制

在完成将class文件信息加载到JVM并产生Class对象后,就可执行Class对象的静态方法或实例化对象进行调用了。在源码编译阶段将源码编译为JVM字节码,JVM字节码是一种中间代码的方式,要由JVM在运行期对其进行解释并执行,这种方式成为字…

ES6中object对象属性

//es5中定义对象属性要么字面量、要么点、要么[],变量与空格在这些方法中没有得到好的支持 /在es6中可以这么定义: let wwww; let obj1{w};//obj1{w:www},属性与值相同,简写 let obj2{[w]:b};//obj2{www:b},支持[]变量定义属性 let obj3{[ws]:c};//obj3{…