【问题标题】:.NET equivalent of size_t.NET 相当于 size_t
【发布时间】:2009-04-21 13:15:54
【问题描述】:

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

【问题讨论】:

  • C DLL 是什么“位”?

标签: .net 64-bit pinvoke


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 必须定义编译符号意味着这不适用于任何 CPU 构建,如果有人修改可执行文件以作为其他东西运行(x86/x64),它将崩溃。
      • @ØysteinE.Krog 我同意,我通常也发现你并不真正需要 size_t 除非你正在使用 C++ dll,所以在这种情况下你不会用 Any 编译CPU,它应该可以工作。这是一个足够肮脏的黑客,很少有案例需要使用它。
      【解决方案4】:

      从 C# v9(需要 dotnet 5 或更高版本)开始,我们现在有 "native sized" integer types 形式为 nintnuint,它们的基本行为分别与 IntPtrUIntPtr 相同。这使得 nuint 成为当 p/invoke 目标需要 size_t 时使用的理想类型,而不需要链接到 Patrick McDonald's answer 中的额外编组魔法。

      【讨论】:

        猜你喜欢
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2010-10-12
        • 2011-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多