gpt4 book ai didi

带有 C++ bool 函数的 C# DllImport 未正确返回

转载 作者:IT老高 更新时间:2023-10-28 12:46:43 24 4
gpt4 key购买 nike

我在 C++ DLL 中有以下函数

extern "C" __declspec(dllexport) bool Exist(const char* name)
{
//if (g_Queues.find(name) != g_Queues.end())
// return true;
//else
// return false;
return false;
}

在我的 C# 类中,我有以下内容:

[DllImport("Whisper.dll", EntryPoint="Exist", CallingConvention=CallingConvention.Cdecl)]
public static extern bool Exist(string name);

然而,每当我调用我的函数时,它总是返回 true,即使我注释掉了我的小函数并使其返回 false。我觉得我的调用约定有问题,或者 P/Invoking 我的 DLL 有任何其他问题,可能与字符串和 const char* 相对应,但现在我完全一无所知。我究竟做错了什么?为什么返回的是 true 而不是 false?

编辑: 我发现这与 const char* 或字符串无关,因为空函数仍然存在问题。我尝试更改 Cdecl 和 StdCall 之间的调用约定,但都不能正常工作。我还设法调试了我的 DLL,它被正确调用并且确实返回 false,但是一旦回到 C#,它就以某种方式为真。更改 CharSet 也没有效果。我确保每次都为我的 C# 程序提供了最新且正确版本的 DLL,所以这也不应该成为问题。同样,当我实际上返回 false 时,我完全不知道为什么结果为 true。

EDIT2: SOReader 为我提供了解决另一个重要问题的建议,请参阅我的评论。遗憾的是,它并没有解决返回问题。

EDIT3: 我的结论是,将 Exist (bool) 的返回类型更改为 (int) 突然使它返回正确的数字 (true = 1, false = 0)。这意味着 C++ 的 bool 和 C# 的 bool 之间可能存在问题。我可以继续使用 int 作为 bool 值,但这仍然不能解释原始问题。也许其他人可以在这个问题上启发我?也许这与我使用 x64 的事实有关(尽管两个项目都编译为 x86)

最佳答案

我找到了解决您问题的方法。您的声明应该在此编码之前:[return:MarshalAs(UnmanagedType.I1)]

所以一切都应该是这样的:

[DllImport("Whisper.dll", EntryPoint="Exist", CallingConvention=CallingConvention.Cdecl)]  
[return:MarshalAs(UnmanagedType.I1)]
public static extern bool Exist([MarshalAs(UnmanagedType.LPStr)] string name);

我在我非常简单的示例中对其进行了测试,并且成功了!

编辑
为什么会发生这种情况? C 将 bool 定义为 4 个字节 int (正如你们中的一些人所说),而 C++ 将其定义为 1 个字节。 C# 团队决定在 PInvoke 期间使用 4 字节 bool 作为默认值,因为大多数系统 API 函数使用 4 字节值作为 bool。如果你想改变这种行为,你必须通过编码(marshal)处理来指定你想要使用 1 字节值。

关于带有 C++ bool 函数的 C# DllImport 未正确返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4608876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com