最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#調(diào)用C++ DLL bool返回值始終為true的問題

 更新時間:2022年11月08日 09:22:48   作者:cchangcs  
這篇文章主要介紹了C#調(diào)用C++ DLL bool返回值始終為true的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

C#調(diào)用C++ DLL bool返回值始終為true

問題描述

在C#項目中,調(diào)用C++ DLL中方法時,bool 返回值始終返回true。

問題原因

C將布爾定義為4字節(jié)int,C++將其定義為1字節(jié)。C#團隊決定在PInvoke期間使用4字節(jié)bool作為默認值,因為大多數(shù)系統(tǒng)API函數(shù)使用4字節(jié)值作為bool。如果要更改此行為,必須通過封送處理來完成,并指定要使用1字節(jié)值。

解決方案

方案一

采用int 返回值替代bool返回值,如返回1代表true,返回0代表false。

方案二

通過[return:MarshalAs(UnmanagedType.I1)]  指定返回值為1字節(jié)值。

[DllImport("Whisper.dll", EntryPoint="Exist", CallingConvention=CallingConvention.Cdecl)]  
[return:MarshalAs(UnmanagedType.I1)]  
public static extern bool Exist([MarshalAs(UnmanagedType.LPStr)] string name);

C#調(diào)用C++的DLL返回值為bool時,值混亂

現(xiàn)象:C++ 導出函數(shù)的返回值為 false,C# 調(diào)用該函數(shù)獲取的返回值卻為 true 。

原因:C++ 導出函數(shù)返回 false 時,采取的方式是:

將 C# 定義的用來接收返回值的 bool 所指的地址開始 4 個字節(jié)設為 0x01000000(見圖1)。

注:用 C++ 代碼調(diào)用該導出函數(shù)時,采取的方式是:將 C++ 定義的用來接收返回值的 bool 所指的地址開始 1 個 字節(jié)設為 0x00;

為什么用 C# 代碼調(diào)用該導出函數(shù)時,采取的方式不是:將 C# 定義的用來接收返回值的 bool 所指的地址開始 1個 字節(jié) 設為 0x00 ? —— 編譯器問題(BUG?)。

圖 1

解決方案

在 C++ 導出函數(shù)中使用 BOOL 代替 bool 。

注:由于C++ 中的 BOOL 占4個字節(jié),

C++ 導出函數(shù)返回 false 時,采取的方式是:

將 C# 定義的用來接收返回值的 bool 所指的地址開始 4 個字節(jié)設為0x00000000(見圖2),因此不存在上述問題。

圖 2

圖3

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C#數(shù)據(jù)結構之順序表(SeqList)實例詳解

    C#數(shù)據(jù)結構之順序表(SeqList)實例詳解

    這篇文章主要介紹了C#數(shù)據(jù)結構之順序表(SeqList)實現(xiàn)方法,結合實例形式較為詳細的分析了順序表的定義、原理與具體實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • 深入理解C#委托delegate的使用

    深入理解C#委托delegate的使用

    本文主要介紹了C#委托delegate的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • C#動態(tài)加載程序集的全攻略

    C#動態(tài)加載程序集的全攻略

    在 C# 中,動態(tài)加載程序集是一種常見的需求,特別是在需要模塊化、插件化或運行時擴展功能的場景中,以下是如何實現(xiàn) C# 代碼依賴的動態(tài)加載的詳細說明,結合了知識庫中的關鍵信息和實際應用技巧,需要的朋友可以參考下
    2025-08-08
  • C#之App.Config文件操作的實現(xiàn)

    C#之App.Config文件操作的實現(xiàn)

    AppConfigHelper提供了一種方便的方式來讀取、添加、修改和刪除應用程序配置文件中的配置項,本文主要介紹了C#之App.Config文件操作的實現(xiàn),感興趣的可以了解一下
    2026-01-01
  • VS2015 C#生成dll文件的方法(32/64)

    VS2015 C#生成dll文件的方法(32/64)

    這篇文章主要介紹了VS2015 C#生成dll文件的方法(32/64),需要的朋友可以參考下
    2016-12-12
  • C#引用類型轉換的常見方式總結

    C#引用類型轉換的常見方式總結

    這篇文章主要介紹了C#引用類型轉換的常見方式,包括子類轉換成父類,父類轉換成子類,以及不是子父級關系類之間的轉換,需要的朋友可以參考下
    2014-09-09
  • C#實現(xiàn)基于ffmpeg加虹軟的人臉識別的示例

    C#實現(xiàn)基于ffmpeg加虹軟的人臉識別的示例

    本篇文章主要介紹了C#實現(xiàn)基于ffmpeg加虹軟的人臉識別的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 如何讓C#、VB.NET實現(xiàn)復雜的二進制操作

    如何讓C#、VB.NET實現(xiàn)復雜的二進制操作

    VB.NET和C#屬于高級語言,對二進制位操作的支持不是很好,比如沒有了移位運算等,用的時候確實很不方便,所以在閑暇之余我重新封裝了一個用于C#、VB.NET的位操作類庫,通過該類庫可以實現(xiàn)數(shù)據(jù)移位、循環(huán)移位、轉換為二進制、將二進制轉換為數(shù)據(jù)等
    2013-07-07
  • C#中Timer實現(xiàn)Tick使用精度的問題

    C#中Timer實現(xiàn)Tick使用精度的問題

    這篇文章主要介紹了C#中Timer實現(xiàn)Tick使用精度的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 基于c# Task自己動手寫個異步IO函數(shù)

    基于c# Task自己動手寫個異步IO函數(shù)

    這篇文章主要介紹了如何基于c# Task自己動手寫個異步IO函數(shù),幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03

最新評論

陵水| 墨竹工卡县| 华蓥市| 房山区| 什邡市| 分宜县| 木里| 富民县| 双峰县| 门头沟区| 望城县| 镇原县| 榆林市| 连云港市| 宁强县| 思茅市| 永仁县| 马公市| 张掖市| 综艺| 浑源县| 博野县| 齐河县| 马鞍山市| 禹城市| 四子王旗| 曲阜市| 连江县| 河北省| 米易县| 衡东县| 鹿泉市| 亳州市| 天等县| 岫岩| 深水埗区| 漳平市| 佛冈县| 武定县| 宝坻区| 苗栗县|