Получение IntPtr для переменной ulong в C # - PullRequest
0 голосов
/ 27 марта 2009

Мне нужно передать IntPtr в IStream.Read, и IntPtr должен указывать на переменную ulong. Как мне получить этот IntPtr, который указывает на мою переменную ulong?

Ответы [ 4 ]

2 голосов
/ 27 марта 2009

Лучший способ - изменить определение IStream:

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

Тогда вы можете написать

int pcbRead = 0;
Read(..., ref pcbRead);
2 голосов
/ 27 марта 2009

Я считаю, что вы должны использовать метод GCHandle, если вы хотите избежать небезопасного кода. Я не уверен, как это работает с типами значений в штучной упаковке.

var handle = GCHandle.Alloc(myVar, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject()
1 голос
/ 27 марта 2009

Если вы не можете использовать небезопасный код, попробуйте следующее.

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

В какой-то момент позже вам потребуется вызвать Marshal.FreeHGlobal для значения "ptr".

0 голосов
/ 27 марта 2009
var pointer = new IntPtr(&myVariable);
...