一直是在写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. ASR项目实战-前处理

    本文深入探讨前处理环节. 首先介绍一些基本的名词,比如 文件名后缀 文件格式 音频格式 采样率和位深 预备知识 文件名后缀.文件格式和音频格式 常见的音频文件,比如.wav..mp3..m4a..wm ...

  2. ElasticSearch之Close index API

    关闭指定的索引. 索引关闭之后: 停止对读.写操作的响应. 停止检索操作的响应. 在索引关闭前,允许执行的操作,关闭之后均不允许执行. ElasticSearch取消对索引的相关维护操作,包含内存中的 ...

  3. Netty 组件介绍

    BootStrap Netty 中的 BootStrap 分为两种:一种是客户端的 BootStrap:一种是服务端的 ServerBootStrap. 客户端的 BootStrap 初始化客户端,该 ...

  4. QRCoder1.4.3生成二维码,不依赖System.Drawing,解决"未能找到类型或命名空间名QRCode","及ImageFormatPng仅在windows上受支持"

    生成二维码1(简单) 包引用: <PackageReference Include="QRCoder" Version="1.4.3" /> usi ...

  5. .NET开源、强大的Web报表统计系统

    前言 今天分享一个.NET开源.强大的Web报表统计系统:CellReport. 项目官方介绍 CellReport 诞生的初衷是为了解决日常快速制作统计报表的需要. CellReport 是一个为复 ...

  6. node版本管理工具推荐

    hello,今天给大家分享几款 node 版本管理的工具. 背景 在开发前端项目的时候,特别是新到公司接手一个多年维护的老项目时,如果 node 版本不正确,有的插件可能无法正确安装,比如我之前提到的 ...

  7. 普通用户登录切换到root用户

    使用su命令: 在终端中输入以下命令并按Enter键: su - 输入root用户的密码,然后按Enter键. 如果密码正确,你将会切换为root用户,并且可以执行root用户的操作. 使用sudo命 ...

  8. C++标准库中copy算法的使用

    目录 std::copy是C++标准库中的算法接口,主要用于两个容器间的复制,据说其效率要优于自己用for循环逐个复制.之前一直非常混淆其中的用法,这里总结了几个例子如下: #include < ...

  9. Python从0到1丨图像增强及运算:形态学开运算、闭运算和梯度运算

    摘要:本文主要介绍图像形态学处理,详细讲解了图像开运算.闭运算和梯度运算.数学形态学是一种应用于图像处理和模式识别领域的新方法,其基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图 ...

  10. What?构造的查询语句会导致堆栈溢出

    摘要:本文归纳了Neo4j和Nebula两个开源图数据库的两个pull request修复的堆栈溢出问题,并试着写写通过阅读pr中的问题而得到的一些启发 本文分享自华为云社区<巧妙构造的查询语句 ...