C# PInvoke 返回 invalid/wrong bool 值,仅当本机代码在调试模式下编译时(仅 OSX)

C# PInvoke returning invalid/wrong bool value, only when native code compiled in debug mode (OSX only)

所以,我有一个奇怪的问题。我正在执行一个简单的 PInvoke 调用以从托管代码中获取布尔值。

C/C++

Q_DECL_EXPORT bool net_variant_getBool(NetVariantContainer* container)
{
    bool result = container->variant->getBool();

    // This function will only return the right value if I use the following code in OSX in release mode (debug works with or without it).
    // qDebug("Return value is: %d", result);

    return result;
}

C#

[DllImport("QmlNet.dylib")]
static extern bool net_variant_getBool(IntPtr variant);

上面的代码原样在 Linux/Windows 调试或发布模式下完美运行,而 OSX 仅在调试模式下运行 .

在发布模式下 OSX,C# 中的结果值是错误的。如果我尝试记录返回的 bool 是什么(以找出问题),它会打印出正确的值,然后返回正确的值! 没错,qDebug 上面被注释掉的宏将 修复 我的问题,如果编译进去的话。Wth?

此问题仅在 OSX/clang 的发布模式下出现。

这是 OSX 上调试和发布版本的编译输出。 https://gist.github.com/pauldotknopf/3949b7e86d6a4bfb59788dd0b7c44536

我完全迷路了。有人有什么想法吗?我不想发布调试库!

原来bool是一个non-blittable类型,不能作为return值使用。参见 here

我将代码更改为 return a byte