由于公司很多底层的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++动态库相关推荐

  1. python调用c++动态库 linux_linux中使用boost.python调用c++动态库的方法

    前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面.测试办法是让 robot ...

  2. python调用.net动态库

    # python调用.net动态库 ### pythonnet简介 ----------------------------- - pythonnet是cpython的扩展 - pythonnet提供 ...

  3. C# : 调用C++动态库(dll)

    在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可以利用re ...

  4. go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...

    Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...

  5. Qt调用CUDA动态库及配置

    本文配置环境:Win7(x64)+VS2012+CUDA+Qt5.5.0 1.首先保证CUDA集成到VS下(如下图顺利安装Nsight for VS2012).CUDA安装比较简单,选自定义安装,然后 ...

  6. C语言调用so动态库的两种方式

    方式1:类似静态库的调用(使用头文件) 这种方式生成的程序会在启动时候就加载so动态库. add.h int add(int x, int y); add.c #include "add.h ...

  7. Java调用so动态库方法

    在Java里面调用so动态库的方法 1.引入jna依赖 <dependency><groupId>net.java.dev.jna</groupId><art ...

  8. Node.js 调用 dll动态库 以华旭身份证阅读器为例

    需求来源 由于使用Electron使用开发桌面端,同时也需要连接硬件设备,单纯使用js方法无法完成,需要通过Node调用dll动态库方式完成. 版本说明: node v12.18.3 (32位) np ...

  9. python调用c++动态库

    python调用C++动态库 生成C++动态库 1.编译成64位的dll库 2. C++ 模板 3. 示例 Python调用带参数的动态库 python与c数据类型 int.long.float.do ...

最新文章

  1. 5G和AI机器人平台为工业4.0和无人机提供服务
  2. 解决ubuntu上opengl的问题
  3. codevs——1294 全排列
  4. kali学习日记第二篇 -- Nessus
  5. python itertools.product_Python的itertools.product 方法
  6. C++ Primer 5th笔记(chap 19 特殊工具与技术)将成员函数用作可调用对象
  7. 排序算法-C++实现
  8. rocketmq 初探(一)
  9. 【翻译】如何获取正在运行的StreamInsight实例版本号?
  10. ​七周二次课(5月7日)监控io性能、free命令、ps命令、查看网络状态、linux下抓包...
  11. C语言中浮点数在内存中的存储方式
  12. LBS与空间索引原理
  13. JavaScript中document的四种方法
  14. 生日祝福html_祝我家的猪,生日快乐 | 告白墙第21期
  15. 山经·南山经:猨翼山 [yuán yì shān]
  16. oracle备份数据库的格式,ORACLE 数据库备份文件的后缀是()。
  17. 中止执行后超过2年_执行中止。债权人是否两年内都要申请执行一次。如果中止执行两年内不申请执行,是否都再也执行不了...
  18. php使用PdfParser搭配tcpdf解析pdf文件
  19. Umeng—新浪登录问题
  20. thinkphp5简介

热门文章

  1. c语言编程游戏开代码错误,[蓝桥杯][历届试题]数字游戏 (C语言代码)(兄弟们帮我看一下为什么运行错误86%)...
  2. python协成_Python协程(上)
  3. MATLAB电压不平衡,电力系统不对称故障计算的Matlab算法程序
  4. php三维数组转换二维数组,php 三维数组转二维数组(多维数组变合拼二维数组)(foreach循环 数组叠加)...
  5. jmeter进程和线程的区别_一文搞懂进程和线程的区别
  6. hashmap hash冲突怎么解决_HashMap原理及冲突之简谈
  7. semantic ui中文文档_Vuetify-广受欢迎的Material风格的开源UI框架
  8. ubuntu安装python_Linux下的Python开发配置鸭
  9. java的uuid有什么用_java – 什么是有效的UUID?
  10. java线程池执行器_Java线程池ThreadPoolExecutor的使用