[DllImport(MyUnmanagedLibrary, CallingConvention = CallingConvention.Cdecl)]
internal static extern int MyFunction();
假设这是我从非托管 C++ 库导入的函数。在这种情况下,外部函数被声明为返回一个 int
。 int
的大小在托管 C# 代码中不会改变,但它会根据非托管 C++ 代码中的体系结构而改变。假设它返回一个 int
是否安全?我应该使用 IntPtr
作为返回值吗?还是别的?
最佳答案
int
在 C# 中是并且将永远是 System.Int32
,关键是每个 C++ 编译器(理论上)都可以自由地使用类型大小做任何它想做的事情(在一定限度内),因此,如果您想避免不匹配,您应该更改代码的 C++ 端,使其返回一个固定大小的整数(例如 int32_t
)。 IntPtr
无能为力,因为 int
没有定义为具有指针的大小(实际上,在 x86_64 Windows 上 int
是 32 位,而int *
是 64 位)。
另一方面,x86 Windows 上的任何编译器极不可能将 int
定义为不同于 32 位 2 的补码整数的任何东西,对于明显的二进制兼容性原因。
关于c# - 从返回 int 的非托管代码中获取外部函数是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14798276/