zoukankan      html  css  js  c++  java
  • 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,完成!

  • 相关阅读:
    centos7/RHEL7安装LibreOffice
    CentOS7开机启动管理systemd简介及使用
    Vim使用技巧
    16_用LVM扩展xfs文件系统(当分区空间不够时)
    15_RHEL7挂载NTFS分区
    14_RHEL7安装mplayer
    polyfill-eventsource added missing EventSource to window ie浏览器 解决方案
    关于vue,webpack 中 “exports is not defined”报错
    2018 vue前端面试题
    Error: No PostCSS Config found in... 报错 踩坑记
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15097351.html
Copyright © 2011-2022 走看看