[DllImport(MyUnmanagedLibrary, CallingConvention = CallingConvention.Cdecl)]
internal static extern int MyFunction();
Run Code Online (Sandbox Code Playgroud)
假设这是我从非托管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位二进制补码整数不同的,明显的二进制兼容性的原因.