C#如何调用C++(进阶篇)
上一篇文章最后,提出的一个问题:如果一个c++库中有很多方法,需要一个个声明??这样岂不是要写很多代码??,而且没有智能提示看到提供了那些方法。
如下图:

如果有朋友需要用这种方式调用,而又不知道怎么使用,请看我的上一篇文章:https://www.cnblogs.com/skyfreedom/p/11773597.html
针对上述问题,在使用过程中总结,记录下来,供需要的朋友参考。
重点:通过CLI实现c#调用c++
看完了本文,相信你就会了,一步步操作就是了。
一、 新建一个netcore控制台应用程序;
这个是我们测试调用C++用的

二、 创建一个c++空项目
如图:

项目创建完成,我们添加一个类,写几个方法,这儿就简单写一个计算器的加减乘除吧!

在CaculateData.h中添加如下代码,定义几个函数声明;

#include <stdio.h>
#include <stdlib.h>
#include <iostream> #ifdef CaculateDLL_EXPORTS
#define Calculate_EXPORTS __declspec(dllexport)
#else
#define Calculate_EXPORTS __declspec(dllimport)
#endif extern "C" Calculate_EXPORTS int Add(int numberA, int numberB); extern "C" Calculate_EXPORTS int Subtract(int numberA, int numberB); extern "C" Calculate_EXPORTS int Multiplication(int numberA, int numberB); extern "C" Calculate_EXPORTS int Divided(int numberA, int numberB); class CaculateData
{
public:
CaculateData();
~CaculateData(); };
可以看到,#ifdef的宏没有定义,所以我们需要添加一个宏:
项目右键---属性---配置属性---C/C++---预处理器---预处理器定义,将定义的宏添加进去;

可以看到,定义好了,颜色就变成紫色的,说明已经声明了宏;

在CaculateData.cpp中实现这几个方法;
#include "CaculateData.h"
#include <iostream> CaculateData::CaculateData()
{
} CaculateData::~CaculateData()
{
} Calculate_EXPORTS int Add(int numberA, int numberB)
{
return numberA + numberB;
} Calculate_EXPORTS int Subtract(int numberA, int numberB)
{
return numberA - numberB;
} Calculate_EXPORTS int Multiplication(int numberA, int numberB)
{
return numberA * numberB;
} Calculate_EXPORTS int Divided(int numberA, int numberB)
{
if (numberB == ) {
std::cout << "除数不能为空" << std::endl;
}
return numberA / numberB;
}
修改C++工程项目输出目录,这儿主要是便于CLI引用,我们这儿同意定义到Testinvoking项目的输出目录..\bin\Debug\netcoreapp2.2
(修改步骤:项目右键—属性—配置属性—常规—输出目录)
配置类型修改为:动态库.dll
(修改步骤:项目右键—属性—配置属性—常规—配置类型)

然后生成;
结果如下:可以看到,日志已经打印出来,告知我们生成成功了。

去对应目录看一下,也OK

三、新建一个CLR项目
这个项目就是来实现C#调用C++的

因为需要调用Caculate.dll,所以需要引用它;
配置属性—VC++目录—库目录(把刚刚生成Caculate.dll的路径添加进去)

同时引用库:

添加一个类InvokeCon.cpp,用它来调用Caculate.dll中的方法

InvokeCon.cpp代码如下:
#include "InvokeCon.h" InvokeCon::InvokeCon()
{
} int InvokeCon::AddCli(int numberA, int numberB)
{
return Add(numberA, numberB);
} int InvokeCon::SubtractCli(int numberA, int numberB)
{
return Subtract(numberA, numberB);
} int InvokeCon::MultiplicationCli(int numberA, int numberB)
{
return Multiplication(numberA, numberB);
} int InvokeCon::DividedCli(int numberA, int numberB)
{
return Divided(numberA, numberB);
}
InvokeCon.h代码:
#pragma once #include <iostream>
#include "C:\Users\tjy\source\repos\TestInvoking\Caculate\CaculateData.h"//引用库声明对应文件路径
public ref class InvokeCon
{
public:
InvokeCon(); int AddCli(int numberA, int numberB);
int SubtractCli(int numberA, int numberB);
int MultiplicationCli(int numberA, int numberB);
int DividedCli(int numberA, int numberB);
};
然后编译,修改编译类型为动态库dll

然后生成:此时就产生了CliDll.dll库
四、c#通过引用CliDll.dll来调用Caculate中的方法
1、添加对Dll的引用;

2、在C#项目中添加测试代码:

可以看到,此时就能够调用多个方法,而且会有方法名提示!
using System; namespace TestInvoking
{
public class Program
{
public static void Main(string[] args)
{
try
{
Console.WriteLine("---------c#通过CLI调用C++类方法---------");
Console.Write("请输入numberA:");
int numberA = Convert.ToInt32(Console.ReadLine());
Console.Write("请输入numberB:");
int numberB = Convert.ToInt32(Console.ReadLine()); InvokeCon invoke = new InvokeCon();
int addResult = invoke.AddCli(numberA, numberB);
int subResult = invoke.SubtractCli(numberA, numberB);
int mutilResult = invoke.MultiplicationCli(numberA, numberB);
int divResult = invoke.DividedCli(numberA, numberB); Console.WriteLine($"the {numberA} And {numberB} sum is:{addResult};sub is:{subResult};Mutil is:{mutilResult};div is:{divResult}");
}
catch(Exception ex)
{
Console.WriteLine($"ex:{ex}");
} Console.WriteLine("执行成功");
Console.ReadLine();
}
}
}
OK,完成!
代码已经放到了github,需要的朋友可以去看,就是这篇文章简单的demo:
github地址:https://github.com/tomorrowGooddays/Invoke
说明:操作过程中有任何问题可以留言讨论,写错不易,欢迎纠正!原创文章,转载请说明出处,谢谢!
C#如何调用C++(进阶篇)的更多相关文章
- C#如何调用C++(基础篇)
闲暇之余,记一下笔记!记录一下c#如何调用C++的动态库(dll). 步骤: 一.创建一个C++类,例如: AddOperate.h extern _declspec(dllexport) int S ...
- Membership三步曲之进阶篇 - 深入剖析Provider Model
Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...
- python 面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- 最快让你上手ReactiveCocoa之进阶篇
前言 由于时间的问题,暂且只更新这么多了,后续还会持续更新本文<最快让你上手ReactiveCocoa之进阶篇>,目前只是简短的介绍了些RAC核心的一些方法,后续还需要加上MVVM+Rea ...
- ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC ...
- Python之路【第十七篇】:Django【进阶篇 】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- PHP学习笔记 - 进阶篇(11)
PHP学习笔记 - 进阶篇(11) 数据库操作 PHP支持哪些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Syba ...
- PHP学习笔记 - 进阶篇(10)
PHP学习笔记 - 进阶篇(10) 异常处理 抛出一个异常 从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被 ...
- PHP学习笔记 - 进阶篇(9)
PHP学习笔记 - 进阶篇(9) 图形图像操作 GD库简介 GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新 ...
随机推荐
- 多线程-Thread和ThreadPool
多线程原理 多线程都是基于委托的. 多线程优缺点 缺点: 1.导致程序复杂,开发调试维护困难,特别是线程交互. 2.线程过多导致服务器卡死,因为占用CPU 内存等资源. 优点: 1.良好的交互,特别对 ...
- 目录:JAVA
收藏: Java:类与继承
- 简易的CRM系统案例之Struts2&Spring整合+Hibernate3+JSP+MySQL版本
主要对上一篇Struts2&Spring整合的改造 简易的CRM系统案例之Struts2+Hibernate3+JSP+MySQL版本 src/bean.xml <beans xmlns ...
- LeetCode_122. Best Time to Buy and Sell Stock II
122. Best Time to Buy and Sell Stock II Easy Say you have an array for which the ith element is the ...
- migrate设置
migrate配置 进入项目manage所在的目录中执行如下命令,否则会报错:no such table: django_session 进入cmd 输入盘符比如:E: 切换目录 cd E:\prog ...
- js实现前端导出大文件Excel
//base64转换成blob function dataURIToBlob(dataURI, callback) { var binStr = atob(dataURI.split(",& ...
- ELK之在CentOS7.5上使用rpm包安装配置ELK7版本
一,安装环境查看 二,软件版本选用 jdk 1.8.0_171 elasticsearch 7.1.1 kibana 7.1.1 logstash 7.1.1 三,安装配置 1,安装JDK 过程不详述 ...
- 统一建模语言UML
目录 1. UML定义 2. UML结构 2.1 视图(View) 2.2 图(Diagram) 2.3 模型元素(Model element) 2.4 通用机制(General mechanism) ...
- python 创建虚拟环境(virtualenv)
原文地址:https://www.jianshu.com/p/2645d8f2e690 另附连接:Linux环境下虚拟环境virtualenv安装和使用 virtualenv 安装 1.Install ...
- 安装LoadRunner各种提示解决方法(转载)
原文地址链接:https://jingyan.baidu.com/article/915fc414fc60fc51394b20fa.html 1.问:当安装提示"Micosoft Visua ...