欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

問(wèn)題描述

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

問(wèn)題原因

C將布爾定義為4字節(jié)int,C++將其定義為1字節(jié)。C#團(tuán)隊(duì)決定在PInvoke期間使用4字節(jié)bool作為默認(rèn)值,因?yàn)榇蠖鄶?shù)系統(tǒng)API函數(shù)使用4字節(jié)值作為bool。如果要更改此行為,必須通過(guò)封送處理來(lái)完成,并指定要使用1字節(jié)值。

解決方案

方案一

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

方案二

通過(guò)[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時(shí),值混亂

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

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

將 C# 定義的用來(lái)接收返回值的 bool 所指的地址開(kāi)始 4 個(gè)字節(jié)設(shè)為 0x01000000(見(jiàn)圖1)。

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

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

圖 1

解決方案

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

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

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

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

圖 2

圖3

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

相關(guān)文章

最新評(píng)論