小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C#總結(jié)(四)調(diào)用C++動態(tài)庫

 羊玉wngbx 2019-07-17

由于公司很多底層的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ù)之前一定要先確認(rèn),否則可能出現(xiàn)函數(shù)調(diào)用導(dǎo)致堆棧不對稱。原因可能是托管的 PInvoke 簽名與非托管的目標(biāo)簽名不匹配的問題。函數(shù)的CallingConvention和CharSet,可以查看動態(tài)庫對應(yīng)的 .h頭文件。

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

        可以通過Dependency Walker工具進(jìn)行反編譯查看別人寫的動態(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文件加載進(jìn)去,就尅看到動態(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放在程序運(yùn)行的根目錄或者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ù)的默認(rèn)約定。 
ThisCall 第一個參數(shù)是 this 指針,它存儲在寄存器 ECX 中。其他參數(shù)被推送到堆棧上。此調(diào)用約定用于對從非托管 DLL 導(dǎo)出的類調(diào)用方法。 
Winapi 此成員實際上不是調(diào)用約定,而是使用了默認(rèn)平臺調(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ù)在 DLL 中的位置。在托管對象中,目標(biāo)函數(shù)的原名或序號入口點(diǎn)將標(biāo)識跨越交互操作邊界的函數(shù)。此外,您可以將入口點(diǎn)映射到一個不同的名稱,這實際上是將函數(shù)重命名。一般默認(rèn)不設(shè)置此參數(shù)。

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

  

  4. 其他說明

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

  

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多