日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#总结(四)调用C++动态库

發(fā)布時間:2025/3/15 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#总结(四)调用C++动态库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  由于公司很多底層的SDK,都是C++開發(fā),上層的應(yīng)用軟件卻是C# Winform程序。在實際工作的過程中,就經(jīng)常碰到了C# 程序調(diào)用C++ 動態(tài)庫的問題。最近一直在和C++ 打交道,C# 怎么調(diào)用C++ 類庫函數(shù)。也遇到了一些問題,所以就來總結(jié)總結(jié)C#程序調(diào)用C++動態(tài)庫時的各種坑。

?

  1.?可能遇到的問題:

? ? ? ? C#在調(diào)用動態(tài)庫的過程中我也遇到了以下一些問題:

????????1、C++中有指針,C#中需要使用指針嗎?

????????由于C++中的動態(tài)庫中有指針參數(shù),因此我也是用.NET的不安全代碼,使用了C#的指針,但是也還是出現(xiàn)了一些問題,如在C#中傳入的參數(shù)是一個二維數(shù)組時就出現(xiàn)了問題,最后只能改C++函數(shù)傳入?yún)?shù)的參數(shù)類型。

????????2、C#和C++中的類型如何轉(zhuǎn)換呢?

??????? 雖然C#和C++比較類似,但是其給我們的參數(shù)類型我們要與C#的參數(shù)類型一一對應(yīng)起來,具體看后續(xù)說明。

????????3、C++函數(shù)中的CallingConventionCharSet 怎么設(shè)置?

   調(diào)用C++函數(shù)之前一定要先確認,否則可能出現(xiàn)函數(shù)調(diào)用導(dǎo)致堆棧不對稱。原因可能是托管的?PInvoke?簽名與非托管的目標(biāo)簽名不匹配的問題。函數(shù)的CallingConvention和CharSet,可以查看動態(tài)庫對應(yīng)的 .h頭文件。

????????4、如何反編譯C++的dll的名稱,端口?

??????? 可以通過Dependency Walker工具進行反編譯查看別人寫的動態(tài)庫的信息

   5、指針函數(shù)如何傳參?

   對于函數(shù)需要的指針函數(shù),C# 調(diào)用時,可以定義委托來傳入?yún)?shù)。?

   6、需要注意C++ dll 編譯的平臺是x86還是x64,是多字節(jié)的還是雙字節(jié)的(Unicode)。

?

  2.?通過Dependency Walke查看dll的名稱,端口

  下載Dependency 后將對應(yīng)的C++ dll文件加載進去,就尅看到動態(tài)庫的對應(yīng)的信息,同時也可以通過.h 頭文件查看。

?

  3. 如何調(diào)用

  c#調(diào)用c++動態(tài)庫一般我們這樣寫

[DllImport(SDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]public static extern int IKSDK_Release();  1. DllImport的第一個參數(shù)SDK是動態(tài)庫dll的路徑,此dll放在程序運行的根目錄或者c:windows/sytem32下,建議在程序根目錄創(chuàng)建一個子目錄來放置相應(yīng)的C++ 動態(tài)庫文件,方便以后更新。

  2. CallingConvention 參數(shù)是c#調(diào)用c++的方式 是個枚舉 msdn解釋如下:

Cdecl調(diào)用方清理堆棧。這使您能夠調(diào)用具有?varargs?的函數(shù)(如?Printf),使之可用于接受可變數(shù)目的參數(shù)的方法。?
FastCal不支持此調(diào)用約定。
StdCall被調(diào)用方清理堆棧。這是使用平臺 invoke 調(diào)用非托管函數(shù)的默認約定。?
ThisCall第一個參數(shù)是?this?指針,它存儲在寄存器 ECX 中。其他參數(shù)被推送到堆棧上。此調(diào)用約定用于對從非托管 DLL 導(dǎo)出的類調(diào)用方法。?
Winapi此成員實際上不是調(diào)用約定,而是使用了默認平臺調(diào)用約定。例如,在 Windows 上默認為?StdCall,在 Windows CE.NET 上默認為?Cdecl。?

  3. CharSet參數(shù)是控制名稱重整以及將字符串參數(shù)封送到函數(shù)中的方式。 默認值為 CharSet.Ansi。

  4.?entrypoint參數(shù)用于標(biāo)識函數(shù)在 DLL 中的位置。在托管對象中,目標(biāo)函數(shù)的原名或序號入口點將標(biāo)識跨越交互操作邊界的函數(shù)。此外,您可以將入口點映射到一個不同的名稱,這實際上是將函數(shù)重命名。一般默認不設(shè)置此參數(shù)。

  5. 其他參數(shù),請查看MSDN對于 DllImportAttribute 的說明。

  

  4. 其他說明

  C# 調(diào)用C++ 動態(tài)庫,還有一個特別麻煩的問題就是參數(shù)對于的問題。后續(xù)會結(jié)合網(wǎng)上的資料總結(jié)一份詳細的對照表。

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/zhangweizhong/p/8119340.html

總結(jié)

以上是生活随笔為你收集整理的C#总结(四)调用C++动态库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。