免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C#總結(jié)(四)調(diào)用C++動(dòng)態(tài)庫
由于公司很多底層的SDK,都是C++開發(fā),上層的應(yīng)用軟件卻是C# Winform程序。在實(shí)際工作的過程中,就經(jīng)常碰到了C# 程序調(diào)用C++ 動(dòng)態(tài)庫的問題。最近一直在和C++ 打交道,C# 怎么調(diào)用C++ 類庫函數(shù)。也遇到了一些問題,所以就來總結(jié)總結(jié)C#程序調(diào)用C++動(dòng)態(tài)庫時(shí)的各種坑。
1. 可能遇到的問題:
C#在調(diào)用動(dòng)態(tài)庫的過程中我也遇到了以下一些問題:
1、C++中有指針,C#中需要使用指針嗎?
由于C++中的動(dòng)態(tài)庫中有指針參數(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ù)類型一一對應(yīng)起來,具體看后續(xù)說明。
3、C++函數(shù)中的CallingConventionCharSet 怎么設(shè)置?
調(diào)用C++函數(shù)之前一定要先確認(rèn),否則可能出現(xiàn)函數(shù)調(diào)用導(dǎo)致堆棧不對稱。原因可能是托管的 PInvoke 簽名與非托管的目標(biāo)簽名不匹配的問題。函數(shù)的CallingConvention和CharSet,可以查看動(dòng)態(tài)庫對應(yīng)的 .h頭文件。
4、如何反編譯C++的dll的名稱,端口?
可以通過Dependency Walker工具進(jìn)行反編譯查看別人寫的動(dòng)態(tài)庫的信息
5、指針函數(shù)如何傳參?
對于函數(shù)需要的指針函數(shù),C# 調(diào)用時(shí),可以定義委托來傳入?yún)?shù)。
6、需要注意C++ dll 編譯的平臺(tái)是x86還是x64,是多字節(jié)的還是雙字節(jié)的(Unicode)。
2. 通過Dependency Walke查看dll的名稱,端口
下載Dependency 后將對應(yīng)的C++ dll文件加載進(jìn)去,就尅看到動(dòng)態(tài)庫的對應(yīng)的信息,同時(shí)也可以通過.h 頭文件查看。
3. 如何調(diào)用
c#調(diào)用c++動(dòng)態(tài)庫一般我們這樣寫
[DllImport(SDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int IKSDK_Release();
1. DllImport的第一個(gè)參數(shù)SDK是動(dòng)態(tài)庫dll的路徑,此dll放在程序運(yùn)行的根目錄或者c:windows/sytem32下,建議在程序根目錄創(chuàng)建一個(gè)子目錄來放置相應(yīng)的C++ 動(dòng)態(tài)庫文件,方便以后更新。
2. CallingConvention 參數(shù)是c#調(diào)用c++的方式 是個(gè)枚舉 msdn解釋如下:
Cdecl調(diào)用方清理堆棧。這使您能夠調(diào)用具有 varargs 的函數(shù)(如 Printf),使之可用于接受可變數(shù)目的參數(shù)的方法。
FastCal不支持此調(diào)用約定。
StdCall被調(diào)用方清理堆棧。這是使用平臺(tái) invoke 調(diào)用非托管函數(shù)的默認(rèn)約定。
ThisCall第一個(gè)參數(shù)是 this 指針,它存儲(chǔ)在寄存器 ECX 中。其他參數(shù)被推送到堆棧上。此調(diào)用約定用于對從非托管 DLL 導(dǎo)出的類調(diào)用方法。
Winapi此成員實(shí)際上不是調(diào)用約定,而是使用了默認(rèn)平臺(tái)調(diào)用約定。例如,在 Windows 上默認(rèn)為 StdCall,在 Windows CE.NET 上默認(rèn)為 Cdecl。
3. CharSet參數(shù)是控制名稱重整以及將字符串參數(shù)封送到函數(shù)中的方式。 默認(rèn)值為 CharSet.Ansi。
4. entrypoint參數(shù)用于標(biāo)識(shí)函數(shù)在 DLL 中的位置。在托管對象中,目標(biāo)函數(shù)的原名或序號(hào)入口點(diǎn)將標(biāo)識(shí)跨越交互操作邊界的函數(shù)。此外,您可以將入口點(diǎn)映射到一個(gè)不同的名稱,這實(shí)際上是將函數(shù)重命名。一般默認(rèn)不設(shè)置此參數(shù)。
5. 其他參數(shù),請查看MSDN對于 DllImportAttribute 的說明。
4. 其他說明
C# 調(diào)用C++ 動(dòng)態(tài)庫,還有一個(gè)特別麻煩的問題就是參數(shù)對于的問題。后續(xù)會(huì)結(jié)合網(wǎng)上的資料總結(jié)一份詳細(xì)的對照表。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
在 C# 中通過 P/Invoke 調(diào)用Win32 DLL
C#調(diào)用C++dll中的類
VS2015用C++創(chuàng)建的動(dòng)態(tài)庫導(dǎo)出函數(shù)名亂碼原因分析
C#中DllImport用法和路徑問題
C#中調(diào)用Windows API的要點(diǎn)
C#DllImport的用法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服