.NET大小的等效值\u t

.NET大小的等效值\u t,.net,64-bit,pinvoke,.net,64 Bit,Pinvoke,我有一段.NET代码,我想把它移植到64位。这些代码基本上是对其他一些C dll的一组P/Invoke调用。C dll中的一个函数具有参数“size\t”。我应该在P/Invoke签名中使用什么样的数据类型,以便编组工作正常。我曾考虑使用IntPtr或UIntPtr,但有人说它们在.NET中是指针等价物,不应该使用它。有人知道这是什么类型的吗?UIntPtr可以工作(IntPtr可能也可以工作,但是大小\u t是未签名的,所以UIntPtr更合适) JaredPar在他的(和a)上写了一些关于这

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

UIntPtr可以工作(IntPtr可能也可以工作,但是大小\u t是未签名的,所以UIntPtr更合适)


JaredPar在他的(和a)上写了一些关于这方面的内容。

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

我发现了一个可以帮助您实现类似行为的恶意攻击。它要求您为64位版本定义编译符号
\u WIN64
,然后您可以执行以下操作:

#if _WIN64
    using size_t = UInt64;
#else
    using size_t = UInt32;
#endif
注意:您必须在每个要使用
size\u t
类型的文件中使用上述代码

您还可以定义自己的整数类型(与定义的UInt64非常相似)并重用它,而无需将上述代码放入每个需要访问
size\t
的文件中,但它非常复杂(imho)

\if\u WIN64
使用_size_t=UInt64;
#否则
使用_size_t=UInt32;
#恩迪夫
[可序列化]
[CLSCompliant(false)]
[ComVisible(true)]
公共结构大小\u t:IComparable、IFormattable、IConvertible、IComparable、IEquatable
{
私有大小值;
公共大小(大小值)
{
_值=val;
}
//您必须在下面添加所有重载
}

这将允许
size\u t
根据平台更改其类型,但正确重载必要的运算符是非常棘手的

什么是“位”是C DLL?必须定义编译符号意味着这对于任何CPU构建都是不起作用的,如果有人修改可执行文件来运行其他的(x86/x64),它就会崩溃。因此,在这种情况下,您不会使用任何CPU进行编译,它应该可以工作。这是一个足够肮脏的黑客行为,很少有案例值得使用它。
#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
}