在C#中将IntPtr转换为ulong变量

时间:2009-03-27 14:26:09

标签: c# interop intptr istream

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

最好的方法是更改​​IStream定义:

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

然后你可以写

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

var pointer = new IntPtr(&myVariable);