C#調用C++的dll兩種方法(托管與非托管)


C#與C++交互,總體來說可以有兩種方法:

  • 利用PInvoke實現直接調用 非托管C++
  • 利用C++/CLI作為代理中間層

一、非托管C++

由於C#編寫的是托管代碼,編譯生成微軟中間語言,而C++代碼則編譯生成本地機器碼(這種C++也有叫做本地C++或者非托管C++,VC6.0就是用於開發非托管C++代碼的平台),這兩種語言進行混合編程就存在一定困難。

比較常用的方法是使用DllImport的方法,這種方法在網上有很多介紹,這里就不詳細敘述了。但是用過這種方法的人都知道這種方法對於導出函數還可以但是卻沒法導出非托管C++類!非常的要命。

C# 通過P/Invoke調用C/C++函數

extern "C"外部聲明,表示函數和變量是按照C語言的方式編譯和鏈接的。

__decspec(dllexport)的目的是為了將對應的函數放入到DLL動態庫中。

extern "C" _declspec(dllexport)的目的是為了使用DllImport調用非托管C++的DLL文件。因為使用DllImport只能調用由C語言函數做的DLL。

vs2019 實現C#調用c++的dll兩種方法

二、托管C++ 與 C++/CLI

除了C#、非托管C++外,C系列中還存在一種語言叫做托管C++,這種語言語法上和非托管C++幾乎一樣,但是卻和C#一樣編譯成為微軟中間語言,這樣托管C++就可以和C#良好地通信,即可以在C#中使用托管C++類。

另外,托管C++還有兩個及其重要的特性就是:

  • 可以調用非托管C++的類和函數!
  • 托管C++的程序集可以嵌套非托管C++編譯的機器碼!

所以我們的技術路徑也就明晰了:C#以托管C++為中介調用非托管C++的類和函數。換句話說也就是用托管C++給非托管C++代碼做一個外殼包裝供C#調用。

托管C++

托管C++已經被廢棄,C++托管代碼的現代擴展叫做C++/CLI

什么是托管C++ (managed C++)

C++/CLI

C++/CLI 是微軟推出的一個跑在 CLI 上的語言,它的主要特性都包含在名字里了:

  1. 語法基於 C++,理論上講是 C++ 語言的超集,面向 CLI 部分的語法是微軟自創的一套新語法。
  2. 目標平台是 CLI。和同門師兄弟 ,C# 和 F# 一樣,C++/CLI 以 CLI 平台為目標編譯平台,因此天生具有和其他 CLI 語言的互操作性。

C++/CLI 最大的一個優勢,是可以直接和原生 C/C++ 代碼進行混合編譯,使用 C/C++ 的函數和數據結構(被微軟稱為 mixed mode 編程)。這個優勢在進行 .NET 平台和 Native 代碼互操作編程時體現的尤其明顯。

參考:

C++/CLI——想說愛你不容易

托管C++ (導出注釋)

編程實現

參考vs2019 實現C#調用c++的dll兩種方法

 

常見報錯

1、后面有::的名稱一定是類名或者命名空間

出現問題:在托管c++項目中的,InvokeCon.cpp中時 寫int InvokeCon.AddCli()報錯。

應該是命名空間的問題,

嘗試在頭文件.h中增加 using namespace System;

更多參考

C#調用C++托管類,實現C#和C++的混合編程

C#調用C++的dll兩種方法(托管與非托管)

具有 C++/CLI 互操作層的 Windows 桌面應用程序可以移植到 .NET Core

如何將 C++/CLI 項目移植到 .NET Core


免責聲明!

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



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