关于从错误管理的C ++ dll导出的函数我遇到了一个奇怪的问题,我使用C#代码:C#中收到的返回bool总是正确的,无论我在C ++中返回什么。我把它缩小了,得到了一个包含以下代码的C ++文件:
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) bool init()
{
return false;
}
#ifdef __cplusplus
}
#endif
我将它构建到一个DLL中并导入C#中的函数:
using System;
using System.Runtime.InteropServices;
namespace Test
{
class TestDll
{
[DllImport( "dlltest_d" )]
public static extern bool init();
}
class Program
{
static void Main( string[] args )
{
if( !TestDll.init() )
{
Console.WriteLine( "init failed" );
return;
}
Console.WriteLine( "init succeeded" );
}
}
}
当我运行它时,我得到以下输出:
init成功
我很困惑。有什么想法吗?
答案 0 :(得分:1)
bool
是可怕的原生类型。每个人都以自己的方式行事。在C#中,bool
上的默认互操作映射到BOOL
C ++类型,该类型处理的值不同于bool
。
您需要使用[return:MarshalAs(UnmanagedType.I1)]
指定正确的编组,并且不要忘记使用C调用约定。