網站首頁 編程語言 正文
C#調用C++ DLL bool返回值始終為true
問題描述
在C#項目中,調用C++ DLL中方法時,bool 返回值始終返回true。
問題原因
C將布爾定義為4字節int,C++將其定義為1字節。C#團隊決定在PInvoke期間使用4字節bool作為默認值,因為大多數系統API函數使用4字節值作為bool。如果要更改此行為,必須通過封送處理來完成,并指定要使用1字節值。
解決方案
方案一
采用int 返回值替代bool返回值,如返回1代表true,返回0代表false。
方案二
通過[return:MarshalAs(UnmanagedType.I1)]? 指定返回值為1字節值。
[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時,值混亂
現象:C++ 導出函數的返回值為 false,C# 調用該函數獲取的返回值卻為 true 。
原因:C++ 導出函數返回 false 時,采取的方式是:
將 C# 定義的用來接收返回值的 bool 所指的地址開始 4 個字節設為 0x01000000(見圖1)。
注:用 C++ 代碼調用該導出函數時,采取的方式是:將 C++ 定義的用來接收返回值的 bool 所指的地址開始 1 個 字節設為 0x00;
為什么用 C# 代碼調用該導出函數時,采取的方式不是:將 C# 定義的用來接收返回值的 bool 所指的地址開始 1個 字節 設為 0x00 ? —— 編譯器問題(BUG?)。
圖 1
解決方案
在 C++ 導出函數中使用 BOOL 代替 bool 。
注:由于C++ 中的 BOOL 占4個字節,
C++ 導出函數返回 false 時,采取的方式是:
將 C# 定義的用來接收返回值的 bool 所指的地址開始 4 個字節設為0x00000000(見圖2),因此不存在上述問題。
圖 2
圖3
原文鏈接:https://blog.csdn.net/github_39611196/article/details/122629856
相關推薦
- 2022-06-06 Python字符串常規操作小結_python
- 2022-10-25 golang值接收者和指針接收者的區別介紹_Golang
- 2022-01-05 webpack——Loader示例:打包css文件
- 2024-01-16 Oracle的取整函數
- 2022-07-14 Nginx限流和黑名單配置的策略_nginx
- 2022-11-13 Python反射機制案例超詳細講解_python
- 2024-07-18 Spring Security之認證信息的處理
- 2022-07-06 pandas實現一行拆分成多行_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支