亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#調用C++ DLL bool返回值始終為true的問題

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

C#調用C++ DLL bool返回值始終為true

問題描述

在C#項目中,調用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#調用C++的DLL返回值為bool時,值混亂

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

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

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

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

為什么用 C# 代碼調用該導出函數(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論