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

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

4

2 回答 2

5

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

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

于 2013-02-10T13:39:54.160 回答
0

例如,您需要使用“-m32”或“-m64”为 g++ 设置编译器选项。更具体地根据您的“机器相关选项”选择最佳匹配

于 2013-02-10T14:16:41.867 回答