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
C#总结(四)调用C++动态库相关推荐
- python调用c++动态库 linux_linux中使用boost.python调用c++动态库的方法
前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面.测试办法是让 robot ...
- python调用.net动态库
# python调用.net动态库 ### pythonnet简介 ----------------------------- - pythonnet是cpython的扩展 - pythonnet提供 ...
- C# : 调用C++动态库(dll)
在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可以利用re ...
- go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...
Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...
- Qt调用CUDA动态库及配置
本文配置环境:Win7(x64)+VS2012+CUDA+Qt5.5.0 1.首先保证CUDA集成到VS下(如下图顺利安装Nsight for VS2012).CUDA安装比较简单,选自定义安装,然后 ...
- C语言调用so动态库的两种方式
方式1:类似静态库的调用(使用头文件) 这种方式生成的程序会在启动时候就加载so动态库. add.h int add(int x, int y); add.c #include "add.h ...
- Java调用so动态库方法
在Java里面调用so动态库的方法 1.引入jna依赖 <dependency><groupId>net.java.dev.jna</groupId><art ...
- Node.js 调用 dll动态库 以华旭身份证阅读器为例
需求来源 由于使用Electron使用开发桌面端,同时也需要连接硬件设备,单纯使用js方法无法完成,需要通过Node调用dll动态库方式完成. 版本说明: node v12.18.3 (32位) np ...
- python调用c++动态库
python调用C++动态库 生成C++动态库 1.编译成64位的dll库 2. C++ 模板 3. 示例 Python调用带参数的动态库 python与c数据类型 int.long.float.do ...
最新文章
- 5G和AI机器人平台为工业4.0和无人机提供服务
- 解决ubuntu上opengl的问题
- codevs——1294 全排列
- kali学习日记第二篇 -- Nessus
- python itertools.product_Python的itertools.product 方法
- C++ Primer 5th笔记(chap 19 特殊工具与技术)将成员函数用作可调用对象
- 排序算法-C++实现
- rocketmq 初探(一)
- 【翻译】如何获取正在运行的StreamInsight实例版本号?
- ​七周二次课(5月7日)监控io性能、free命令、ps命令、查看网络状态、linux下抓包...
- C语言中浮点数在内存中的存储方式
- LBS与空间索引原理
- JavaScript中document的四种方法
- 生日祝福html_祝我家的猪,生日快乐 | 告白墙第21期
- 山经·南山经:猨翼山 [yuán yì shān]
- oracle备份数据库的格式,ORACLE 数据库备份文件的后缀是()。
- 中止执行后超过2年_执行中止。债权人是否两年内都要申请执行一次。如果中止执行两年内不申请执行,是否都再也执行不了...
- php使用PdfParser搭配tcpdf解析pdf文件
- Umeng—新浪登录问题
- thinkphp5简介
热门文章
- c语言编程游戏开代码错误,[蓝桥杯][历届试题]数字游戏 (C语言代码)(兄弟们帮我看一下为什么运行错误86%)...
- python协成_Python协程(上)
- MATLAB电压不平衡,电力系统不对称故障计算的Matlab算法程序
- php三维数组转换二维数组,php 三维数组转二维数组(多维数组变合拼二维数组)(foreach循环 数组叠加)...
- jmeter进程和线程的区别_一文搞懂进程和线程的区别
- hashmap hash冲突怎么解决_HashMap原理及冲突之简谈
- semantic ui中文文档_Vuetify-广受欢迎的Material风格的开源UI框架
- ubuntu安装python_Linux下的Python开发配置鸭
- java的uuid有什么用_java – 什么是有效的UUID?
- java线程池执行器_Java线程池ThreadPoolExecutor的使用