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

hat*_*enn 4 c# c++ pinvoke

[DllImport(MyUnmanagedLibrary, CallingConvention = CallingConvention.Cdecl)]
internal static extern int MyFunction();
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*lia 5

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

在另一方面,这是非常不可能的,在x86 Windows中的任何编译器将永远定义int为任何超过32位二进制补码整数不同的,明显的二进制兼容性的原因.

  • 确保正确性不是"优化".更改C++代码以使用像`int32_t`这样的固定大小类型是一个好主意. (4认同)