码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-11-02 19:51:28      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:new   打印   一个个   lex   image   问题:   row   没有   ring   

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

如下图:

技术图片

 

 如果有朋友需要用这种方式调用,而又不知道怎么使用,请看我的上一篇文章:

针对上述问题,在使用过程中总结,记录下来,供需要的朋友参考。

重点:通过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 == 0) {
        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++(进阶篇)

标签:new   打印   一个个   lex   image   问题:   row   没有   ring   

原文地址:https://www.cnblogs.com/skyfreedom/p/11783629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!