c#通過CLI調用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 == 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
說明:操作過程中有任何問題可以留言讨論,寫錯不易,歡迎糾正!原創文章,轉載請說明出處,謝謝!