一直是在写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方式的更多相关文章

  1. ASP.net 中手工调用WS(POST方式)

    ASP.net 中手工调用WS(POST方式)核心代码:string strUrl="http://localhost:21695/service1.asmx/getmythmod" ...

  2. linux调用库的方式

    linux调用库的方式有三种:1.静态链接库2.动态链接库3.动态加载库 其中1,2都是在编程时直接调用,在链接时加参数-l进行链接,运行时自动调用第三种需要在编程时使用dlopen等函数来获取库里面 ...

  3. led跑马灯多种方法(移位法,位拼接法,调用模块法,位移及位拼接语法,testbench的理解,源文件的存储路径,计数器的个数,调用模块的方式)

    跟着教程写了几种方法,才发现自己写的虽然能实现,但比较繁琐.教程有三种方法: 1.移位法,每次左移一位,相比我自己写的,优点是不用把每一种情况都写出来.但是需要考虑左移到最后一位时需要自己再写个赋值语 ...

  4. Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)

    利用Mysqldump备份和迁移,我想很多人都用过,具体参数不介绍了,这里主要讲.NET调用Mysqldump进行备份和.NET调用Mysql.exe进行导入数据. 这里使用的是5.1版的Mysqld ...

  5. 第一零二天上课 PHP TP框架 引入文件路径问题和调用验证码的方式

    外部文件引入到视图模板的方式       1,将外部文件放在Public文件夹下,用load标签引入       2,在模板出书写引入代码(方法有很多,只有以下方法不容易出问题) <load h ...

  6. Unix/Linux中shell调用sqlplus的方式

    Unix/Linux下,shell脚本调用sqlplus的几种方式介绍: 一.最简单的shell调用sqlplus #!/bin/bash sqlplus -S /nolog > sqlplus ...

  7. C# 调用C++ CLR dll类库时,实现从 string 到 sbyte* 的转换

    问题描述 今天在做项目的时候碰到一个问题,就是用C++编写CLR类库dll的时候,C++的函数参数列表中包含一个char*的输出型参数,然而在C#调用该dll时候,会自动将函数的中的char*参数“翻 ...

  8. dubbo异步调用三种方式

    异步通讯对于服务端响应时间较长的方法是必须的,能够有效地利用客户端的资源,在dubbo中,消费端<dubbp:method>通过 async="true"标识. < ...

  9. 设计基于HTML5的APP登录功能及安全调用接口的方式

    转自:http://blog.csdn.net/linlzk/article/details/45536065 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而 ...

  10. PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明

    用CLR写函数:标量函数,表值函数 很好理解,如果用聚合函数则不是那么好理解了, 这里将CLR函数说明一下,其实关键是对聚合函数说明 用CLR写聚合函数关键点,是要理解CLR与SQL是如何进行数据交互 ...

随机推荐

  1. 聊一聊 C# 的线程本地存储TLS到底是什么

    一:背景 1. 讲故事 有朋友在后台留言让我说一下C#的 ThreadStatic 线程本地存储是怎么玩的?这么说吧,C#的ThreadStatic是假的,因为C#完全是由CLR(C++)承载的,言外 ...

  2. Windows手工入侵排查思路

    文章来源公众号:Bypass Windows系统被入侵后,通常会导致系统资源占用过高.异常端口和进程.可疑的账号或文件等,给业务系统带来不稳定等诸多问题.一些病毒木马会随着计算机启动而启动并获取一定的 ...

  3. aspnetcore使用websocket实时更新商品信息

    先演示一下效果,再展示代码逻辑. 中间几次调用过程省略... 暂时只用到了下面四个项目 1.产品展示页面中第一次通过接口去获取数据库的列表数据 /// <summary> /// 获取指定 ...

  4. f-VAEGAN-D2:VAE+GAN处理零样本学习问题

    虽然f-VAEGAN-D2在题目中说"适用任意样本",但对比的Few-shot相关的实验较少,这里仅讨论零样本学习的情况. 1. 背景介绍 由于为每个对象收集足够数量的高质量带标签 ...

  5. 神经网络优化篇:理解mini-batch梯度下降法(Understanding mini-batch gradient descent)

    理解mini-batch梯度下降法 使用batch梯度下降法时,每次迭代都需要历遍整个训练集,可以预期每次迭代成本都会下降,所以如果成本函数\(J\)是迭代次数的一个函数,它应该会随着每次迭代而减少, ...

  6. KAFKA EAGLE 监控MRS kafka之操作实践

    本文分享自华为云社区<KAFKA EAGLE 监控MRS kafka之操作实践>,作者: 啊喔YeYe . 1.Kafka Eagle简介 Kafka eagle 是一款分布式.高可用的k ...

  7. 活动回顾|火山引擎 DataLeap 分享:DataOps、数据治理、指标体系最佳实践(文中领取 PPT)

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在 7 月 21 日至 22 日举行的 ArchSummit 全球架构师峰会(深圳站)及 DataFunCon.数 ...

  8. Python异步编程之yield from

    yield from 简介 yield from 是Python3.3 后新加的语言结构,可用于简化yield表达式的使用. yield from 简单示例: >>> def gen ...

  9. SSL 证书过期巡检脚本

    哈喽大家好,我是咸鱼 我们知道 SSL 证书是会过期的,一旦过期之后需要重新申请.如果没有及时更换证书的话,就有可能导致网站出问题,给公司业务带来一定的影响 所以说我们要每隔一定时间去检查网站上的 S ...

  10. 题解 - Japanese Student Championship 2021

    前言:这场的题解由于蓝桥杯比赛拖延几天才发 关于本篇题解,目前还是有部分题没有解答出来正在加油补题ing 补题链接:Here A - Competition 题意:给定 \(X,Y,Z\) 代表的意义 ...