【问题标题】:Getting an IntPtr to a ulong variable in C#在 C# 中将 IntPtr 获取到 ulong 变量
【发布时间】:2009-03-27 14:26:09
【问题描述】:

我需要将一个 IntPtr 传递给 IStream.Read,并且 IntPtr 应该指向一个 ulong 变量。如何获取指向我的 ulong 变量的 IntPtr?

【问题讨论】:

  • 作为回答这个问题的人的旁注,他想要一个 ulong,因为 .NET 的 IntPtr 在 x64 系统上是 64 位的。
  • 嗯,我需要一个 ulong,因为 IStream.Read 需要一个 IntPtr 到一个 ulong。

标签: c# interop intptr istream


【解决方案1】:

最好的办法是改变 IStream 定义:

void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv,
          int cb, /*IntPtr*/ ref int pcbRead);

那你就可以写了

int pcbRead = 0;
Read(..., ref pcbRead);

【讨论】:

  • 经过一番思考后,我意识到这是我最好的选择。 IStream 毕竟只是一个接口。为什么不创建我自己的界面...
【解决方案2】:

如果你想避免不安全的代码,我相信你必须使用 GCHandle 方法。我不确定这如何与盒装值类型一起使用。

var handle = GCHandle.Alloc(myVar, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject()

【讨论】:

  • 这种方法奏效了。有趣的是,我仍然需要将 Marshal.WriteInt64 值返回给我的 ulong 变量(也许只是调试的不够聪明)
【解决方案3】:

如果您不能使用不安全的代码,请尝试以下操作。

var myValue = GetTheValue();
var ptr = Marshal.AllocHGLobal(Marshal.SizeOf(typeof(ulong));
Marshal.StructureToPointer(ptr, myValue, false);

稍后,您需要在“ptr”值上调用 Marshal.FreeHGlobal。

【讨论】:

    【解决方案4】:
    var pointer = new IntPtr(&myVariable);
    

    【讨论】:

    • 虽然这确实获得了指针,但您并没有要求 GC 将其保持固定,因此 myVariable 可能会被移动并且该指针不再属于您。
    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 2017-04-15
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多