一直是在写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. weblogic GC overhead limit exceeded

    weblogic GC overhead limit exceeded 使用weblogic启动较大项目时,超出GC限制,可以通过修改 C:\Oracle\Middleware\Oracle_Home ...

  2. P7112 【模板】行列式求值

    学<高等代数>第二章的时候过来搜了搜模板,结果真搜到了.于是水一篇题解. 本文部分内容来自<高等代数>. 行列式定义 对于一个 \(n\) 阶行列式 \[A_{n \times ...

  3. flutter BLoC框架

    BLoC(Business Logic Component)是一种在Flutter中用于管理状态和处理业务逻辑的设计模式和架构模式. BLoC 的核心思想是将应用程序的状态.业务逻辑和UI分离开来,以 ...

  4. Nginx unexpected end of file 配置证书遇到问题,如何解决?

    原文链接 https://bysocket.com/nginx-unexpected-end-of-file-expecting-in-key-file/ 一.Nginx unexpected end ...

  5. 【API进阶之路】因为不会创建云服务器,我被实习生摆了一道

    摘要:9个步骤通过API创建云服务器. 事情是这样的,公司成立了一个新项目,要给项目建官网,并搭建一个web服务器.按照我的习惯,搭建一个本地虚拟机就好了,部署简单方便还好配置,云服务器嘛,写了10年 ...

  6. 用了这个评估优化LiteOS镜像利器,我有点飘...

    摘要:本文会给大家介绍下LiteOS Studio的镜像分析工具,这可是一个评估.优化镜像文件RAM.ROM占用大小的利器. 大家都知道嵌入式开发板由于受成本限制,芯片的RAM.Flash等硬件资源有 ...

  7. DTT年度收官圆桌π,华为云8位技术专家的年末盘点

    摘要:收下这份DTT年度收官圆桌π总结,在新的一年心想事成,技术上更上一层楼. 本文分享自华为云社区<DTT年度收官圆桌π,华为云8位技术专家的年末盘点>,作者:华为云社区精选 . 在20 ...

  8. DTSE Tech Talk | 云原生架构下的数字身份治理实践

    摘要:由华为技术大咖VS派拉软件CTO为大家详解云原生架构下的身份管理平台,构建云安全数字身份入口. 本文分享自华为云社区<DTSE Tech Talk | 第4期:云原生架构下的数字身份治理实 ...

  9. 认识一下MRS里的“中间人”Alluxio

    摘要:Alluxio在mrs的数据处理生态中处于计算和存储之间,为上层spark.presto.mapredue.hive计算框架提供了数据抽象层,计算框架可以通过统一的客户端api和全局命名空间访问 ...

  10. C# Winform 自定义窗口,最大化遮住任务栏

    解决 C# Winform 自定义窗口,最大化遮住任务栏 的问题,可以通过获取屏幕大小来控制最大值,来实现,代码如下 Rectangle ScreenArea = System.Windows.For ...