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
。
所以,我有一个奇怪的问题。我正在执行一个简单的 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
。