1. 程式人生 > 程式設計 >vs2019 實現C#呼叫c++的dll兩種方法

vs2019 實現C#呼叫c++的dll兩種方法

1.託管與非託管的區別

連結地址(僅供參考)
除了連結中的,在實用角度出發:
非託管需要一個個宣告引用,就很繁瑣
但是託管(雖然麻煩)不用宣告,只需要調好配置即可,還是比較方便的
為什麼寫這個部落格,也是因為不同版本vs2017和vs2019有所區別,託管就容易踩坑,希望大家能看看,解決問題(我也很菜,大佬輕噴)

2.非託管類的實現

第一步:建立C++空專案(命名Caculate)新增一個類AddOperate

.h程式碼部分:

#pragma once

extern "C" _declspec(dllexport) int Sum(int a,int b);

class AddOperate
{
public:

};

.cpp程式碼部分:

#include "AddOperate.h"
#include "iostream"
using namespace std;

int Sum(int a,int b)
{
 if (a - (int)a != 0 || b - (int)b != 0) 
 {
  cout << "請輸入整數" << endl;
  return -1;
 }
 return a + b;
}

第二步:將C++程式碼編譯成動態庫dll

首先:專案–屬性—配置型別–常規—配置型別—動態庫(.dll)(注意x64)

在這裡插入圖片描述

然後:專案–屬性–配置屬性–C/C+±–高階—編譯為—便以為C++程式碼(/TP)

在這裡插入圖片描述

第三步:將dll拷貝到c#專案輸入目錄,一般在bin/debug下面

第四步:C#呼叫dll

C#程式碼如下:注意:C#也用x64

#include "AddOperate.h"
#include "iostream"
using namespace std;

int Sum(int a,int b)
{
 if (a - (int)a != 0 || b - (int)b != 0) 
 {
  cout << "請輸入整數" << endl;
  return -1;
 }
 return a + b;
}

3.託管類的實現

註明:windows窗體控制程式也可以這樣

第一步:開啟vs2019,新建新專案在C#裡找到控制檯應用(.NET Core)

在這裡插入圖片描述

儘量把專案放到特定一個資料夾(經驗)

第一步必須這樣做

第二步:在你已經建立好的vs介面中,右擊解決方案->新增->新建專案->C++空專案(取名Caculate)

在這裡插入圖片描述

新建的專案命名為Caculate

在這裡插入圖片描述

這個時候新增一個類CaculateData

在這裡插入圖片描述

CaculateData.h的程式碼如下

#include "AddOperate.h"
#include "iostream"
using namespace std;

int Sum(int a,int b)
{
 if (a - (int)a != 0 || b - (int)b != 0) 
 {
  cout << "請輸入整數" << endl;
  return -1;
 }
 return a + b;
}

CaculateData.cpp程式碼如下

#include "AddOperate.h"
#include "iostream"
using namespace std;

int Sum(int a,int b)
{
 if (a - (int)a != 0 || b - (int)b != 0) 
 {
  cout << "請輸入整數" << endl;
  return -1;
 }
 return a + b;
}

之後你需要配置你的專案
1.新增巨集 CaculateDLL_EXPORTS
方法:在Caculate的屬性頁->配置屬性->C/C+±>前處理器->前處理器定義
(注意,我們需要平臺為Win32)

在這裡插入圖片描述

2.在Caculate的屬性頁->配置屬性->常規->設定輸出目錄和配置型別
輸出目錄:C#資料夾的bin\Debug\netcoreapp3.1(版本更新會有區別)
配置型別:動態庫dll

在這裡插入圖片描述

編譯ctrl+B完成後在輸出目錄會出現Caculate.dll檔案

第三步:再次右擊解決方案->新增->新建專案->C++空專案(取名CilDll)

(這個專案是實現CLR專案)
首先,配置CLR(關鍵所在,否則會出大問題)
配置屬性—高階—公共語言執行時支援

在這裡插入圖片描述

然後,配置屬性—VC++目錄—庫目錄(把剛剛生成Caculate.dll的路徑新增進去)

在這裡插入圖片描述

同時引用庫:
配置屬性—連結器—輸入—附加依賴項(注意是.lib)

在這裡插入圖片描述

注意:檢視語言符合模式()
配置屬性—C/C++—語言—符合模式(否)

在這裡插入圖片描述

最後匯出為dll(注意Win32)

在這裡插入圖片描述

建立類InvokeCon

InvokeCon.h程式碼如下

#pragma once
#include <iostream>
#include "C:\Users\hp\Desktop\測試\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);
};

InvokeCon.cpp程式碼如下

#pragma once
#include <iostream>
#include "C:\Users\hp\Desktop\測試\Caculate\CaculateData.h"//引用庫宣告對應檔案路徑
public ref class InvokeCon
{
public:
 InvokeCon();

 int AddCli(int numberA,int numberB);
};

編譯ctrl+B

第四步:回到C#進行配置

首先:引用CilDll.dll

在這裡插入圖片描述

然後:專案右鍵—屬性—生成—目標平臺×86(非常重要)

在這裡插入圖片描述

C#程式碼如下

using System;

namespace testing
{
 class Program
 {
  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();
  }
 }
}

到此這篇關於vs2019 實現C#呼叫c++的dll兩種方法的文章就介紹到這了,更多相關C#呼叫c++的dll內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!