[DllImport(MyUnmanagedLibrary, CallingConvention = CallingConvention.Cdecl)]
internal static extern int MyFunction();
假设这是我从非托管C ++库导入的函数。在这种情况下,外部函数被声明为返回int
。托管C#代码中int
的大小不会改变,但它会根据非托管C ++代码中的体系结构而改变。假设它返回int
是否安全?我应该使用IntPtr
作为返回值吗?或其他什么?
答案 0 :(得分:5)
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基于您的“机器相关选项”