我有一段.NET代码,我想移植到64位。该代码基本上是一组对其他C dll的P / Invoke调用。 C dll中的功能之一具有参数“ size_t”。我应该在P / Invoke签名中使用哪种数据类型,以便封送工作正常。我当时在考虑使用IntPtr或UIntPtr,但有人说它们是.NET中的指针等效物,不应使用它。有谁知道正确的类型是什么?
如果size_t因平台而异,则必须使用IntPtr。如果它是固定大小的整数,请使用int,uint或long(取决于原始声明)。
我发现了一个肮脏的骇客,它可以帮助您实现类似的行为。它要求您为64位版本定义一个编译符号_WIN64
,然后可以执行以下操作:
#if _WIN64
using size_t = UInt64;
#else
using size_t = UInt32;
#endif
注意:您必须在每个要使用size_t
类型的文件中使用以上代码。
您还可以定义自己的整数类型(类似于UInt64的定义)并重复使用它,而不必将上面的代码放在每个需要访问size_t
的文件中,但这非常复杂(恕我直言)。
#if _WIN64
using _size_t = UInt64;
#else
using _size_t = UInt32;
#endif
[Serializable]
[CLSCompliant(false)]
[ComVisible(true)]
public struct size_t : IComparable, IFormattable, IConvertible, IComparable<_size_t>, IEquatable<_size_t>
{
private _size_t _value;
public size_t(_size_t val)
{
_value = val;
}
// You have to add all of your overloads below
}
这将允许size_t
根据平台更改其类型,但是正确重载必要的运算符非常棘手!