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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C#配置log4net實現(xiàn)將日志分類記錄到不同的日志文件中
log4net是.Net下一個非常優(yōu)秀的開源日志記錄組件,log4net記錄日志的功能非常強大,它可以將日志分不同的等級,以不同的格式,輸出到不同的媒介,下面我們就來看看C#如何配置log4net讓日志分類記錄到不同的日志文件吧2024-02-02在C#中根據(jù)HardwareID獲取驅動程序信息的實現(xiàn)代碼
這篇文章主要介紹了C#中根據(jù)HardwareID獲取驅動程序信息的實現(xiàn)代碼,需要的朋友可以參考下2016-12-12C#中的multipart/form-data提交文件和參數(shù)
這篇文章主要介紹了C#中的multipart/form-data提交文件和參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06解析C#中用Process類終止進程,執(zhí)行命令的深入分析
本篇文章是對C#中用Process類終止進程,執(zhí)行命令進行了詳細的分析介紹,需要的朋友參考下2013-05-05