。net等效于size_t

问题描述 投票:12回答:4

我有一段.NET代码,我想移植到64位。该代码基本上是一组对其他C dll的P / Invoke调用。 C dll中的功能之一具有参数“ size_t”。我应该在P / Invoke签名中使用哪种数据类型,以便封送工作正常。我当时在考虑使用IntPtr或UIntPtr,但有人说它们是.NET中的指针等效物,不应使用它。有谁知道正确的类型是什么?

.net 64-bit pinvoke
4个回答
19
投票

UIntPtr将起作用(IntPtr也可能起作用,但是size_t是未签名的,因此UIntPtr更合适)

JaredPar在他的blog(和follow-up)上写了一些与此有关的内容。


1
投票

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


1
投票

看看这个Document by Microsoft

它说对于64位应用程序,size_t为64位整数。

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


1
投票

我发现了一个肮脏的骇客,它可以帮助您实现类似的行为。它要求您为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根据平台更改其类型,但是正确重载必要的运算符非常棘手!

© www.soinside.com 2019 - 2024. All rights reserved.