Мне нужно передать IntPtr в IStream.Read, и IntPtr должен указывать на переменную ulong. Как мне получить этот IntPtr, который указывает на мою переменную ulong?
Лучший способ - изменить определение IStream:
void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv, int cb, /*IntPtr*/ ref int pcbRead);
Тогда вы можете написать
int pcbRead = 0; Read(..., ref pcbRead);
Я считаю, что вы должны использовать метод GCHandle, если вы хотите избежать небезопасного кода. Я не уверен, как это работает с типами значений в штучной упаковке.
var handle = GCHandle.Alloc(myVar, GCHandleType.Pinned); var ptr = handle.AddrOfPinnedObject()
Если вы не можете использовать небезопасный код, попробуйте следующее.
var myValue = GetTheValue(); var ptr = Marshal.AllocHGLobal(Marshal.SizeOf(typeof(ulong)); Marshal.StructureToPointer(ptr, myValue, false);
В какой-то момент позже вам потребуется вызвать Marshal.FreeHGlobal для значения "ptr".
var pointer = new IntPtr(&myVariable);