我有一段.NET代码,我想将其移植到64位。代码基本上是一组对其他C dll的P / Invoke调用。 C dll中的一个函数具有参数'size_t'。我应该在P / Invoke签名中使用什么数据类型,以便编组工作正常。我正在考虑使用IntPtr或UIntPtr,但有些人说它们是.NET中的指针等价物并且不应该使用它。有谁知道这个的正确类型是什么?
答案 0 :(得分:17)
答案 1 :(得分:1)
如果size_t因平台而异,则必须使用IntPtr。如果它是一个固定大小的整数,请使用int,uint或long(取决于原始声明)。
答案 2 :(得分:1)
答案 3 :(得分:1)
我发现了一个可以帮助你实现类似行为的肮脏黑客行为。它要求您为64位版本定义编译符号_WIN64
,然后您可以执行以下操作:
#if _WIN64
using size_t = UInt64;
#else
using size_t = UInt32;
#endif
注意:您必须在每个想要使用size_t
类型的文件中使用上述代码。
您还可以定义自己的整数类型(非常类似于UInt64)并重用它,而无需将上述代码放在需要访问size_t
的每个文件中,但它非常复杂(imho)。
#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
根据平台更改其类型,但正确地重载必要的运算符非常棘手!