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項目的輸出目錄..\bin\Debug\netcoreapp2.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\tjy\source\repos\TestInvoking\Caculate\CaculateData.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,完成!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM