.NET相当于size_t

时间:2009-04-21 13:15:54

标签: .net 64-bit pinvoke

我有一段.NET代码,我想将其移植到64位。代码基本上是一组对其他C dll的P / Invoke调用。 C dll中的一个函数具有参数'size_t'。我应该在P / Invoke签名中使用什么数据类型,以便编组工作正常。我正在考虑使用IntPtr或UIntPtr,但有些人说它们是.NET中的指针等价物并且不应该使用它。有谁知道这个的正确类型是什么?

4 个答案:

答案 0 :(得分:17)

UIntPtr可以工作(IntPtr也可以工作,但size_t是无符号的,因此UIntPtr更合适)

JaredPar在他的blog(以及follow-up)上写了一些关于此的内容。

答案 1 :(得分:1)

如果size_t因平台而异,则必须使用IntPtr。如果它是一个固定大小的整数,请使用int,uint或long(取决于原始声明)。

答案 2 :(得分:1)

查看此Document by Microsoft

它表示对于64位应用程序size_t是64位int。

但是,如果您调用的DLL是32位dll,则只需要传递32位int

答案 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根据平台更改其类型,但正确地重载必要的运算符非常棘手!