當我們想要在C#中使用C++項目的方法時,這個時候就可以通過調用C++項目的dll來實現,它有靜態和動態調用兩種方法。
DLL(Dynamic Link Library)文件為動態鏈接庫文件,又稱“應用程序拓展”,是軟件文件類型。在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可使用多個DLL文件,一個DLL文件也可能被不同的應用程序使用,這樣的DLL文件被稱為共享DLL文件。[1] (百度百科)
我們在C++項目中寫了如下的一個方法:
那么只需將C++項目下Debug中的dll文件復制到我們C#的bin\Debug\文件夾下即可。
然后就是在代碼中調用它。
注意:
添加屬性:CallingConvention=CallingConvention.Cdecl
主要是處理
在使用托管代碼調用非托管代碼時,發生“對 PInvoke 函數“UseTwiHikVisionDllTest!UseTwiHikVisionDllTest.TwiHikVision::GetFirstPic”的調用導致堆棧不對稱。原因可能是托管的 PInvoke 簽名與非托管的目標簽名不匹配。請檢查 PInvoke 簽名的調用約定和參數與非托管的目標簽名是否匹配。”
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CSharp調用靜態的dll { public partial class Form1 : Form { [DllImport("TestDll01.dll", CallingConvention = CallingConvention.Cdecl)] private extern static int testCount(int a, int b); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { MessageBox.Show(testCount(12, 14).ToString()); } } }
運行結果: