从非托管代码返回int的外部函数是否安全

时间:2013-02-10 13:34:13

标签: c# c++ pinvoke

[DllImport(MyUnmanagedLibrary, CallingConvention = CallingConvention.Cdecl)]
internal static extern int MyFunction();

假设这是我从非托管C ++库导入的函数。在这种情况下,外部函数被声明为返回int。托管C#代码中int的大小不会改变,但它会根据非托管C ++代码中的体系结构而改变。假设它返回int是否安全?我应该使用IntPtr作为返回值吗?或其他什么?

2 个答案:

答案 0 :(得分:5)

C#中的

int始终是System.Int32,关键是每个C ++编译器(理论上)都可以随意使用类型大小(在一定限制范围内)做任何事情,因此,如果你想避免不匹配,你应该改变代码的C ++,使它返回一个固定大小的整数(例如int32_t)。 IntPtr无法帮助,因为int未定义为具有指针的大小(实际上,在x86_64 Windows int上是32位,而int *是64位)

另一方面,由于明显的二进制兼容性原因,x86 Windows上的任何编译器都不可能将int定义为与32位二进制补码整数不同的任何东西

答案 1 :(得分:0)

例如,您需要为g ++设置编译器选项“-m32”或“-m64”。更具体的choose the best match基于您的“机器相关选项”