日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:cchangcs ? 更新時間: 2022-12-08 編程語言

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

欄目分類
最近更新