由于公司很多底層的SDK,都是C++開發(fā),上層的應(yīng)用軟件卻是C# Winform程序。在實(shí)際工作的過程中,就經(jīng)常碰到了C# 程序調(diào)用C++ 動(dòng)態(tài)庫(kù)的問題。最近一直在和C++ 打交道,C# 怎么調(diào)用C++ 類庫(kù)函數(shù)。也遇到了一些問題,所以就來(lái)總結(jié)總結(jié)C#程序調(diào)用C++動(dòng)態(tài)庫(kù)時(shí)的各種坑。
1. 可能遇到的問題: C#在調(diào)用動(dòng)態(tài)庫(kù)的過程中我也遇到了以下一些問題: 1、C++中有指針,C#中需要使用指針嗎? 由于C++中的動(dòng)態(tài)庫(kù)中有指針參數(shù),因此我也是用.NET的不安全代碼,使用了C#的指針,但是也還是出現(xiàn)了一些問題,如在C#中傳入的參數(shù)是一個(gè)二維數(shù)組時(shí)就出現(xiàn)了問題,最后只能改C++函數(shù)傳入?yún)?shù)的參數(shù)類型。 2、C#和C++中的類型如何轉(zhuǎn)換呢? 雖然C#和C++比較類似,但是其給我們的參數(shù)類型我們要與C#的參數(shù)類型一一對(duì)應(yīng)起來(lái),具體看后續(xù)說明。 3、C++函數(shù)中的CallingConventionCharSet 怎么設(shè)置? 調(diào)用C++函數(shù)之前一定要先確認(rèn),否則可能出現(xiàn)函數(shù)調(diào)用導(dǎo)致堆棧不對(duì)稱。原因可能是托管的 PInvoke 簽名與非托管的目標(biāo)簽名不匹配的問題。函數(shù)的CallingConvention和CharSet,可以查看動(dòng)態(tài)庫(kù)對(duì)應(yīng)的 .h頭文件。 4、如何反編譯C++的dll的名稱,端口? 可以通過Dependency Walker工具進(jìn)行反編譯查看別人寫的動(dòng)態(tài)庫(kù)的信息 5、指針函數(shù)如何傳參? 對(duì)于函數(shù)需要的指針函數(shù),C# 調(diào)用時(shí),可以定義委托來(lái)傳入?yún)?shù)。 6、需要注意C++ dll 編譯的平臺(tái)是x86還是x64,是多字節(jié)的還是雙字節(jié)的(Unicode)。
2. 通過Dependency Walke查看dll的名稱,端口 下載Dependency 后將對(duì)應(yīng)的C++ dll文件加載進(jìn)去,就尅看到動(dòng)態(tài)庫(kù)的對(duì)應(yīng)的信息,同時(shí)也可以通過.h 頭文件查看。
3. 如何調(diào)用 c#調(diào)用c++動(dòng)態(tài)庫(kù)一般我們這樣寫 [DllImport(SDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int IKSDK_Release(); 1. DllImport的第一個(gè)參數(shù)SDK是動(dòng)態(tài)庫(kù)dll的路徑,此dll放在程序運(yùn)行的根目錄或者c:windows/sytem32下,建議在程序根目錄創(chuàng)建一個(gè)子目錄來(lái)放置相應(yīng)的C++ 動(dòng)態(tài)庫(kù)文件,方便以后更新。
2. CallingConvention 參數(shù)是c#調(diào)用c++的方式 是個(gè)枚舉 msdn解釋如下:
3. CharSet參數(shù)是控制名稱重整以及將字符串參數(shù)封送到函數(shù)中的方式。 默認(rèn)值為 CharSet.Ansi。 4. entrypoint參數(shù)用于標(biāo)識(shí)函數(shù)在 DLL 中的位置。在托管對(duì)象中,目標(biāo)函數(shù)的原名或序號(hào)入口點(diǎn)將標(biāo)識(shí)跨越交互操作邊界的函數(shù)。此外,您可以將入口點(diǎn)映射到一個(gè)不同的名稱,這實(shí)際上是將函數(shù)重命名。一般默認(rèn)不設(shè)置此參數(shù)。 5. 其他參數(shù),請(qǐng)查看MSDN對(duì)于 DllImportAttribute 的說明。
4. 其他說明 C# 調(diào)用C++ 動(dòng)態(tài)庫(kù),還有一個(gè)特別麻煩的問題就是參數(shù)對(duì)于的問題。后續(xù)會(huì)結(jié)合網(wǎng)上的資料總結(jié)一份詳細(xì)的對(duì)照表。
|
|