C#調(diào)用C++ DLL bool返回值始終為true的問(wèn)題
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)文章
C#實(shí)現(xiàn)簡(jiǎn)單的天氣預(yù)報(bào)示例代碼
這篇文章主要介紹了C#實(shí)現(xiàn)簡(jiǎn)單的天氣預(yù)報(bào)示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06C#在驗(yàn)證文件共享模式下實(shí)現(xiàn)多線程文件寫入
這篇文章主要為大家詳細(xì)介紹了C#在驗(yàn)證文件共享模式下實(shí)現(xiàn)多線程文件寫入的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-01-01C#配置log4net實(shí)現(xiàn)將日志分類記錄到不同的日志文件中
log4net是.Net下一個(gè)非常優(yōu)秀的開(kāi)源日志記錄組件,log4net記錄日志的功能非常強(qiáng)大,它可以將日志分不同的等級(jí),以不同的格式,輸出到不同的媒介,下面我們就來(lái)看看C#如何配置log4net讓日志分類記錄到不同的日志文件吧2024-02-02利用C#實(shí)現(xiàn)批量圖片格式轉(zhuǎn)換功能
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)批量圖片格式轉(zhuǎn)換功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12在C#中根據(jù)HardwareID獲取驅(qū)動(dòng)程序信息的實(shí)現(xiàn)代碼
這篇文章主要介紹了C#中根據(jù)HardwareID獲取驅(qū)動(dòng)程序信息的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-12-12C#中的multipart/form-data提交文件和參數(shù)
這篇文章主要介紹了C#中的multipart/form-data提交文件和參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06C#使用正則表達(dá)式過(guò)濾html標(biāo)簽
最近在開(kāi)發(fā)一個(gè)項(xiàng)目,其中有需求要求我們把一段html轉(zhuǎn)換為一般文本返回,使用正則表達(dá)式是明智的選擇,下面小編給介紹下C#使用正則表達(dá)式過(guò)濾html標(biāo)簽,需要的朋友參考下2016-08-08解析C#中用Process類終止進(jìn)程,執(zhí)行命令的深入分析
本篇文章是對(duì)C#中用Process類終止進(jìn)程,執(zhí)行命令進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05