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

说明:操作过程中有任何问题可以留言讨论,写错不易,欢迎纠正!原创文章,转载请说明出处,谢谢!

最新文章

  1. iOS开发之Runtime机制深入解析
  2. javascript 创建 div
  3. samba
  4. [ 转]Collections.unmodifiableList方法的使用与场景
  5. 【转】JAVA CAS原理深度分析
  6. ASP.NET C# 文件下载
  7. thinkPHP16---伪静态
  8. Google HTML/CSS 编码规范
  9. My &quot;Top 5 R Functions&quot;(转)
  10. NLTK学习笔记(八):文法--词关系研究的工具
  11. sed命令基础
  12. 搭建Hadoop
  13. 关于163发邮件报错535 Error:authentication failed解决方法
  14. sql 注释 语法
  15. jdbc:initialize-database标签的研究
  16. 使用python的Paramiko模块登陆SSH
  17. P3623 [APIO2008]免费道路
  18. angularjs获取元素以及angular.element()用法
  19. mybatis 高级映射 简单例子
  20. 第2章—装配Bean—通过java代码装配bean

热门文章

  1. VS code写stm32
  2. Docs-.NET-C#-指南-语言参考-预处理器指令:#if 预处理指令
  3. react图片自适应组件
  4. 运行时给java对象动态的属性赋值
  5. python面试必备-基础篇
  6. PPT做交互效果
  7. WPF窗体应用程序开发
  8. C# 后台POST和GET 获取数据
  9. 【Leetcode_easy】762. Prime Number of Set Bits in Binary Representation
  10. Ajax校验--最近更新