上一篇文章最后,提出的一个问题:如果一个c++库中有很多方法,需要一个个声明??这样岂不是要写很多代码??,而且没有智能提示看到提供了那些方法。
如下图:
重点:通过CLI实现c#调用c++
看完了本文,相信你就会了,一步步操作就是了。
一、 新建一个netcore控制台应用程序;
这个是我们测试调用C++用的
二、 创建一个c++空项目
如图:
项目创建完成,我们添加一个类,写几个方法,这儿就简单写一个计算器的加减乘除吧!
在CaculateData.h中添加如下代码,定义几个函数声明;
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <iostream>
4
5 #ifdef CaculateDLL_EXPORTS
6 #define Calculate_EXPORTS __declspec(dllexport)
7 #else
8 #define Calculate_EXPORTS __declspec(dllimport)
9 #endif
10
11 extern "C" Calculate_EXPORTS int Add(int numberA, int numberB);
12
13 extern "C" Calculate_EXPORTS int Subtract(int numberA, int numberB);
14
15 extern "C" Calculate_EXPORTS int Multiplication(int numberA, int numberB);
16
17 extern "C" Calculate_EXPORTS int Divided(int numberA, int numberB);
18
19 class CaculateData
20 {
21 public:
22 CaculateData();
23 ~CaculateData();
24
25 };
可以看到,#ifdef的宏没有定义,所以我们需要添加一个宏:
项目右键---属性---配置属性---C/C++---预处理器---预处理器定义,将定义的宏添加进去;
可以看到,定义好了,颜色就变成紫色的,说明已经声明了宏;
在CaculateData.cpp中实现这几个方法;
1 #include "CaculateData.h"
2 #include <iostream>
3
4 CaculateData::CaculateData()
5 {
6 }
7
8
9 CaculateData::~CaculateData()
10 {
11 }
12
13 Calculate_EXPORTS int Add(int numberA, int numberB)
14 {
15 return numberA + numberB;
16 }
17
18 Calculate_EXPORTS int Subtract(int numberA, int numberB)
19 {
20 return numberA - numberB;
21 }
22
23 Calculate_EXPORTS int Multiplication(int numberA, int numberB)
24 {
25 return numberA * numberB;
26 }
27
28 Calculate_EXPORTS int Divided(int numberA, int numberB)
29 {
30 if (numberB == 0) {
31 std::cout << "除数不能为空" << std::endl;
32 }
33 return numberA / numberB;
34 }
修改C++工程项目输出目录,这儿主要是便于CLI引用,我们这儿同意定义到Testinvoking项目的输出目录..inDebug etcoreapp2.2
(修改步骤:项目右键—属性—配置属性—常规—输出目录)
配置类型修改为:动态库.dll
(修改步骤:项目右键—属性—配置属性—常规—配置类型)
然后生成;
结果如下:可以看到,日志已经打印出来,告知我们生成成功了。
去对应目录看一下,也OK
三、新建一个CLR项目
这个项目就是来实现C#调用C++的
因为需要调用Caculate.dll,所以需要引用它;
配置属性—VC++目录—库目录(把刚刚生成Caculate.dll的路径添加进去)
同时引用库:
添加一个类InvokeCon.cpp,用它来调用Caculate.dll中的方法
InvokeCon.cpp代码如下:
1 #include "InvokeCon.h"
2
3 InvokeCon::InvokeCon()
4 {
5 }
6
7 int InvokeCon::AddCli(int numberA, int numberB)
8 {
9 return Add(numberA, numberB);
10 }
11
12 int InvokeCon::SubtractCli(int numberA, int numberB)
13 {
14 return Subtract(numberA, numberB);
15 }
16
17 int InvokeCon::MultiplicationCli(int numberA, int numberB)
18 {
19 return Multiplication(numberA, numberB);
20 }
21
22 int InvokeCon::DividedCli(int numberA, int numberB)
23 {
24 return Divided(numberA, numberB);
25 }
InvokeCon.h代码:
1 #pragma once
2
3 #include <iostream>
4 #include "C:Users jysource
eposTestInvokingCaculateCaculateData.h"//引用库声明对应文件路径
5 public ref class InvokeCon
6 {
7 public:
8 InvokeCon();
9
10 int AddCli(int numberA, int numberB);
11 int SubtractCli(int numberA, int numberB);
12 int MultiplicationCli(int numberA, int numberB);
13 int DividedCli(int numberA, int numberB);
14 };
然后编译,修改编译类型为动态库dll
然后生成:此时就产生了CliDll.dll库
四、c#通过引用CliDll.dll来调用Caculate中的方法
1、添加对Dll的引用;
2、在C#项目中添加测试代码:
可以看到,此时就能够调用多个方法,而且会有方法名提示!
1 using System;
2
3 namespace TestInvoking
4 {
5 public class Program
6 {
7 public static void Main(string[] args)
8 {
9 try
10 {
11 Console.WriteLine("---------c#通过CLI调用C++类方法---------");
12 Console.Write("请输入numberA:");
13 int numberA = Convert.ToInt32(Console.ReadLine());
14 Console.Write("请输入numberB:");
15 int numberB = Convert.ToInt32(Console.ReadLine());
16
17 InvokeCon invoke = new InvokeCon();
18 int addResult = invoke.AddCli(numberA, numberB);
19 int subResult = invoke.SubtractCli(numberA, numberB);
20 int mutilResult = invoke.MultiplicationCli(numberA, numberB);
21 int divResult = invoke.DividedCli(numberA, numberB);
22
23 Console.WriteLine($"the {numberA} And {numberB} sum is:{addResult};sub is:{subResult};Mutil is:{mutilResult};div is:{divResult}");
24 }
25 catch(Exception ex)
26 {
27 Console.WriteLine($"ex:{ex}");
28 }
29
30 Console.WriteLine("执行成功");
31 Console.ReadLine();
32 }
33 }
34 }
OK,完成!