C#调用C++——CLR方式
一直是在写C#,最近接触到的项目中有C#调用C++接口的逻辑,自己学习了下,写个步骤日志,C#掉用C++的托管代码
项目分三个项目:1、底层C++动态库项目,2、中间层的CLR项目,3、上层的C#项目
1. 底层C++动态库项目,
1、新建一个C++动态链接库(Dll)项目,获取新建了其他的项目后在项目属性中将配置类型改为动态库(.dll),具体如下截图

2、然后编写C++代码,比如我这里需要在C++中实现两数相加和相减得到结果的的功能,这里在头文件(.h文件)中定义两个方法Add和Mul,在源文件(.cpp文件)中实现方法Add和Mul。
3、导出C++的函数和变量,这个是非常重要的一步,导出是为了让其他的应用程序能够调用这些函数和变量,这里为了方便定义一个导出的宏,然后后续导出,
这里__declspec(dllexport)修饰符指示编译器和链接器从DLL 导出函数或变量,以便其他应用程序可以使用它,在ExprotDll.h中

2、中间层的CLR项目
1、新建一个C++的CLR项目,CLR项目就是为了面向.net,可以实现.net和C++代码之间可以互相操作。这种项目属性中都是带有公共语言运行时支持和创建时可以选择.net的目标框架(面向.netFramework的,最新的.net Core后的貌似没有这个)

2、配置中间层调用C++动态链接库,这里需要配置包含目录和库目录两个。
包含目录是为了引入C++动态链接库项目的代码,以便写代码时能够在此项目中引入,进而找到动态链接库项目中方法或变量,这里指向的是动态链接库项目的源码所在目录。库目录是引用C++动态链接库项目生成的DLL和Lib,(一般放置在C#项目Debug目录下,后期因为C#程序要加载,尽可能程序库都放置在C#加载的目录下)。

3、编写相应的代码,用来调用底层C++项目封装好的方法或变量。
3、C#上层项目
这个就比较简单了。新建一个C#的项目,比如Web,控制台项目,WPF项目等等。
然后在项目中右键添加项目引用,引入中间层CLR项目(或者其生成的Dll),然后在此项目中就能够找到并使用中间层CLR项目中定义的方法和变量,从而最终调用到C++底层的方法或变量。这里需要注意的是映入了中间层的CLR项目还不够,还需要将底层的C++动态库项目的DLL拷贝到C#项目的运行目录下。不然会报找不到依赖项的错误。
最后,还有一种比较直接的CLR封装调用C++函数的方式,在前面的基数上省略掉了包含目录和库目录的配置,这种如果C++的底层代码逻辑有更新的话,需要每次都去手动更新。 大致步骤就是:
1:第一步也是创建C++的动态库项目,
2、第二步创建C++的CLR项目,将第一步中需要调用的函数的头文件(.h后缀的文件)和第一步的库文件(.lib文件)复制到CLR项根目录下。注意这里如果C++代码有变动,这里每次也要耕者重新替换。
3、创建C#的项目,C#项目种引用CLR项目。
C#调用C++——CLR方式的更多相关文章
- ASP.net 中手工调用WS(POST方式)
ASP.net 中手工调用WS(POST方式)核心代码:string strUrl="http://localhost:21695/service1.asmx/getmythmod" ...
- linux调用库的方式
linux调用库的方式有三种:1.静态链接库2.动态链接库3.动态加载库 其中1,2都是在编程时直接调用,在链接时加参数-l进行链接,运行时自动调用第三种需要在编程时使用dlopen等函数来获取库里面 ...
- led跑马灯多种方法(移位法,位拼接法,调用模块法,位移及位拼接语法,testbench的理解,源文件的存储路径,计数器的个数,调用模块的方式)
跟着教程写了几种方法,才发现自己写的虽然能实现,但比较繁琐.教程有三种方法: 1.移位法,每次左移一位,相比我自己写的,优点是不用把每一种情况都写出来.但是需要考虑左移到最后一位时需要自己再写个赋值语 ...
- Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)
利用Mysqldump备份和迁移,我想很多人都用过,具体参数不介绍了,这里主要讲.NET调用Mysqldump进行备份和.NET调用Mysql.exe进行导入数据. 这里使用的是5.1版的Mysqld ...
- 第一零二天上课 PHP TP框架 引入文件路径问题和调用验证码的方式
外部文件引入到视图模板的方式 1,将外部文件放在Public文件夹下,用load标签引入 2,在模板出书写引入代码(方法有很多,只有以下方法不容易出问题) <load h ...
- Unix/Linux中shell调用sqlplus的方式
Unix/Linux下,shell脚本调用sqlplus的几种方式介绍: 一.最简单的shell调用sqlplus #!/bin/bash sqlplus -S /nolog > sqlplus ...
- C# 调用C++ CLR dll类库时,实现从 string 到 sbyte* 的转换
问题描述 今天在做项目的时候碰到一个问题,就是用C++编写CLR类库dll的时候,C++的函数参数列表中包含一个char*的输出型参数,然而在C#调用该dll时候,会自动将函数的中的char*参数“翻 ...
- dubbo异步调用三种方式
异步通讯对于服务端响应时间较长的方法是必须的,能够有效地利用客户端的资源,在dubbo中,消费端<dubbp:method>通过 async="true"标识. < ...
- 设计基于HTML5的APP登录功能及安全调用接口的方式
转自:http://blog.csdn.net/linlzk/article/details/45536065 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而 ...
- PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明
用CLR写函数:标量函数,表值函数 很好理解,如果用聚合函数则不是那么好理解了, 这里将CLR函数说明一下,其实关键是对聚合函数说明 用CLR写聚合函数关键点,是要理解CLR与SQL是如何进行数据交互 ...
随机推荐
- WeLM微信自研NLP大规模语言模型
2022年9月份微信AI推出自研NLP大规模语言模型WeLM ,该模型是一个尺寸合理的中文模型,能够在零样本以及少样本的情境下完成包多语言任务在内的多种NLP任务.openai的chatgpt是在20 ...
- MongoDB的CRUD操作(入门)
MongoDB的简单介绍: 1:MongoDB是什么? mongodb是非关系数据库 但是是非关系数据库当中功能最丰富,最像关系数据库的 MongoDB是一个基于分布式文件存储的数据库. 由C++语言 ...
- quill富文本编辑器quill粘贴图片上传服务器
强大的富文本编辑器:quill github:32k start++,:https://github.com/quilljs/quill quill粘贴图片上传服务器 <link href=&q ...
- Tpon 1.0 一键查询网站存在过的路径
Tpon 1.0 寻找网站存在过的路径 该工具能够让你发现意料之外的路径 工具描述 编写该工具旨在寻找网站存在过的网站路径,这个地址可能是机器爬下来的也可能是某些人访问过的,在表面你可能看不到它的入口 ...
- GaussDB(DWS)条件表达式函数返回错误结果集排查
摘要:条件表达式函数中出现结果集不一致问题,我们首先要考虑是否入参数据类型不一致导致出参不一致. 本文分享自华为云社区<GaussDB(DWS)条件表达式函数返回错误结果集排查>,作者:y ...
- KubeEdge在国家工业互联网大数据中心的架构设计与应用
摘要:在18年的时候,工信部开展了一个叫国家创新发展工程,这个工程中提出了要建立一个国家工业大数据中心,中国移动在其中承担了边缘协同与数据采集相关功能的研发.本文将从该项目背景下面临的问题与挑战.技术 ...
- 实例解析丨一文搞定GaussDB CM服务异常
摘要:本文主要为大家带来如何处理GaussDB CM服务异常问题. 本文分享自华为云社区<[实例状态]GaussDB CM服务异常>,作者:酷哥. 首先确认是否是虚拟机.网络故障,底层故障 ...
- 一文掌握数仓中auto analyze的使用
摘要:analyze执行的是否及时,在一定程度上直接决定了SQL执行的快慢. 本文分享自华为云社区<一文读懂autoanalyze使用[这次高斯不是数学家]>,作者: leapdb. an ...
- 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步
摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...
- SpringBoot Docker 发布
本文是手动模式,可以移步 Intellij IDEA 集成 Docker 发布 使用 Intellij 集成Docker 发布,比较方便 pom 文件 <groupId>com.vipso ...