C#如何调用C++(进阶篇)

上一篇文章最后,提出的一个问题:如果一个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,完成!

原文地址:https://www.cnblogs.com/ybqjymy/p/15097351.html