这里我们要先注意一个前提:C#与C++的根本区别在于,C#是托管类语言,而C++是非托管性质的。

简单来说就是C#有垃圾回收机制帮我们做很多事情而C++没有。

因此,涉及到C#与C++混用场景的时候这种机制上的区别让两个语言之间的数据交换有着一套比较麻烦的规则。

这也是为什么后来又提出了C++/CLR这个语言,它可以将C#与C++杂糅在一起进行代码编写。

但是有的时候,尤其是当我们做二次开发的时候,很多dll库是现成的,这个时候最好就是通过调用C++dll的方式实现在C#内调用C++的函数,如果用C++/CLR的话你还得写不少的代码。

下面是具体步骤,假如说我们在C++有个函数,CPP中的源代码:

char* GetCharLen(char* input) {char* output = new char[20];strcpy(output, input);return output;
}

这里有一个细节,该函数返回的output一定要在函数内使用new进行空间的申请,否则很可能在C#那边获取不到返回值(尽管C#那边不会报错,但是你拿不到这个字符串的值)。

头文件声明:

extern "C" __declspec(dllexport) char* __stdcall GetCharLen(char* input);

这里请注意头文件的声明,如果你想要在C#中调用这个函数,那就一定不要忘记加上【extern "C" __declspec(dllexport)】这个前缀。

同时,编译这段代码的项目也要做出相应地设置(这里以VS2017为例),首先要设置为编译dll的模式,扩展名设置为【.dll】,同时选择【公共语言运行时支持】:

然后进行编译,编译完成之后的dll放置到你的C#项目的debug目录(这里我的C++编译出的dll名字叫IFCEncodeDecode.dll):

然后在C#中添加一段代码引用这个C++函数:

[DllImport("IFCEncodeDecode.dll", EntryPoint = "GetCharLen", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr GetCharLen(string input);

这里注意了,使用DllImport需要在C#文件头加入引用:

using System.Runtime.InteropServices;

另外,DllImport后面的dll文件名不要写错,EntryPoint这个是你在C++里面声明的函数名,也不能有错误。

大家这里会注意到,C#声明的函数参数以及返回值分别是【string】和【Inptr】,而C++对应的是【char*】,这里是由于C++与C#存在一定的数据类型转换关系,大家可以自行baidu一下,这类资料很多。

然后是调用:

string plain = "序号";
IntPtr b = GetCharLen(plain);
Console.WriteLine(Marshal.PtrToStringAnsi(b));

这里,我们需要用IntPtr这个类型来接受返回值,然后使用一个函数将IntPtr转换为String类型才能进行显示。

关于用C#调用C++的dll中的函数,获取字符串返回值的一些细节相关推荐

  1. python中func函数可以没有返回值吗_python让函数不返回结果的方法

    1.简单介绍print和return的区别,print仅仅是打印在控制台,而return则是将return后面的部分作为返回值:作为函数的输出,可以用变量接走,继续使用该返回值做其它事. 2.函数需要 ...

  2. c语言调用shell命令一 popen使用以及获取命令返回值

    产品升级,新增网卡,原先的产品是arm平台,新网卡是mips平台,需要开发网卡的配置程序,该程序原计划是以守护进程的形式后台执行,不过测试过程中发现系统不是特别稳定,导致程序时不时奔溃下,一时半会儿无 ...

  3. php中定义函数可以没有返回值,在PHP中,定义函数时可以没有返回值。

    氧气氢气二氧甲烷化碳,定义电池的地燃料燃料极反应方为. 都是动发电机气带燃烧后产发电生蒸,函数回值电池电相与传统火燃料力发发电似. 表以地热的深度可达地资源万米下1勘探,没有返目前.并购业的要大于两业 ...

  4. C#调用dll中的函数

    C#调用dll中的函数 文章分类:操作系统 文章来源:http://blog.csdn.net/strmagic/archive/2007/11/02/1863462.aspx 大家在实际工作学习C# ...

  5. 天马行空W:在C++中调用DLL中的函数

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  6. 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)...

    通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern "C"声明导出函数? [已结贴,结贴人:darongtou] 如题,网上搜了N多资料,一直找不 ...

  7. 10.4.4 使用ctypes调用kernel32.dll中的函数

    10.4.4 使用ctypes调用kernel32.dll中的函数 2007-10-17 14:41 孙广磊 人民邮电出版社 字号:T | T 综合评级: 想读(5)  在读(0)  已读(6)   ...

  8. 如何调用 DLL 中的函数

     如何调用 DLL 中的函数 在 DLL工程中的 cpp中函数定义如下: extern "C" _declspec (dllexport ) int add(int a, ch ...

  9. 在C++中调用DLL中的函数

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  10. 在C++中调用DLL中的函数(2)

    本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL ...

最新文章

  1. 从 AlphaGo 到具有人类智慧的 AI 究竟有多远?François Chollet 有了一些新想法
  2. LAN,城域网,广域网,国际互联网
  3. Atitit 实现java的linq 以及与stream api的比较
  4. docker 安装redis第三方集群方案 codis
  5. Python两个内置函数locals 和globals
  6. Kaggle 发布首份数据科学从业报告 | 不及美国同行1/3,中国数据科学家平均年薪约3万美元
  7. 压缩过的js代码怎么还原_Fundebug 前端 JS插件更新至 1.7.0,拆分录屏代码,还原部分 Script error....
  8. java mybits架构图_java架构之路-(mybatis源码)mybatis执行流程源码解析
  9. 使用help()输入keywords查看python中定义的关键字
  10. php 说说,PHP程序员:你过来,给我说说 $this,self,static 有什么区别?
  11. lamp rpm mysql_LAMP基于RPM包实现(httpd与php以module方式结合) 1
  12. 【学习笔记】cs231n-assignment1-two_layer_net
  13. Teststand-并行测试模型设置步骤
  14. 商务网站建设与维护【4】
  15. 华为-IGP协议-ospf精简篇(带实验验证)
  16. 计算机存储单位试题,计算机存储试题及答案
  17. 恒太照明在北交所上市:募资规模缩水三成,第三季度收入下滑
  18. BroadCast Channel
  19. 使用硬盘从linux服务器上复制文件
  20. 北京联通dns服务器位置,ipv6北京联通dns服务器地址

热门文章

  1. centOS安装telnet(在线和rpm包安装)
  2. 【hdu 4658】Integer Partition (无序分拆数、五边形数定理)
  3. Windows 10家庭版和专业版的区别在哪?Windows 10专业版好还是家庭版好?
  4. 通过shell登录OSC并备份博文
  5. linux下搭建apache+mysql+php环境(LAMP)
  6. Render OpenCascade Geometry Curves in OpenSceneGraph
  7. Flutter RotatedBox旋转容器
  8. 书籍-Java性能调优指南
  9. 微信小程序实战篇:小程序之页面数据传递
  10. python面向对象使用方法_python面向对象之方法