Ottenere un IntPtr ad una variabile ULONG in C #
Domanda
Ho bisogno di passare un IntPtr per IStream.Read, e l'IntPtr dovrebbe puntare a una variabile ULONG. Come faccio ad avere questo IntPtr che punta alla mia variabile ULONG?
Soluzione
Il modo migliore è quello di cambiare la definizione IStream:
void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv,
int cb, /*IntPtr*/ ref int pcbRead);
Poi si può scrivere
int pcbRead = 0;
Read(..., ref pcbRead);
Altri suggerimenti
Credo che si deve utilizzare il metodo GCHandle se si vuole evitare il codice non sicuro. Non sono sicuro su come questo funziona con i tipi di valore in scatola.
var handle = GCHandle.Alloc(myVar, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject()
Se non è possibile utilizzare il codice non sicuro provare quanto segue.
var myValue = GetTheValue();
var ptr = Marshal.AllocHGLobal(Marshal.SizeOf(typeof(ulong));
Marshal.StructureToPointer(ptr, myValue, false);
A un certo punto più tardi, è necessario chiamare Marshal.FreeHGlobal sul valore "PTR".
var pointer = new IntPtr(&myVariable);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow