Conseguir um IntPtr para uma variável ulong em C #
Pergunta
Eu preciso passar um IntPtr para IStream.Read, eo IntPtr deve apontar para uma variável ulong. Como faço para obter este IntPtr que aponta para minha variável ulong?
Solução
A melhor maneira é mudar a definição IStream:
void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv,
int cb, /*IntPtr*/ ref int pcbRead);
Em seguida, você pode escrever
int pcbRead = 0;
Read(..., ref pcbRead);
Outras dicas
Eu acredito que você tem que usar o método GCHandle se você quer evitar código inseguro. Eu não tenho certeza sobre como isso funciona com tipos de valor em caixa.
var handle = GCHandle.Alloc(myVar, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject()
Se você não pode usar o código inseguro tente o seguinte.
var myValue = GetTheValue();
var ptr = Marshal.AllocHGLobal(Marshal.SizeOf(typeof(ulong));
Marshal.StructureToPointer(ptr, myValue, false);
Em algum momento mais tarde, você vai precisar ligar para Marshal.FreeHGlobal sobre o valor "ptr".
var pointer = new IntPtr(&myVariable);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow