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
说明:操作过程中有任何问题可以留言讨论,写错不易,欢迎纠正!原创文章,转载请说明出处,谢谢!
最新文章
- iOS开发之Runtime机制深入解析
- javascript 创建 div
- samba
- [ 转]Collections.unmodifiableList方法的使用与场景
- 【转】JAVA CAS原理深度分析
- ASP.NET C# 文件下载
- thinkPHP16---伪静态
- Google HTML/CSS 编码规范
- My ";Top 5 R Functions";(转)
- NLTK学习笔记(八):文法--词关系研究的工具
- sed命令基础
- 搭建Hadoop
- 关于163发邮件报错535 Error:authentication failed解决方法
- sql 注释 语法
- jdbc:initialize-database标签的研究
- 使用python的Paramiko模块登陆SSH
- P3623 [APIO2008]免费道路
- angularjs获取元素以及angular.element()用法
- mybatis 高级映射 简单例子
- 第2章—装配Bean—通过java代码装配bean