c# - Aggiungi offset a IntPtr




.net pinvoke (4)

Ho scoperto che posso evitare le operazioni del puntatore utilizzando i metodi Marshal.ReadByte (), Marshal.ReadInt16 () ecc. Questo gruppo di metodi consente di specificare l'offset in releation all'IntrPtr ...

Sto cercando un modo per eseguire operazioni di puntatore in C # o .NET in particolare.

Voglio fare qualcosa di molto semplice

Avere un puntatore IntPtr Voglio ottenere l'oggetto IntPtr che punta a 2 byte avanti.

Ho letto alcuni post che lo snippet ingannevole funzionerà ...

IntPtr ptr = new IntPtr(oldptr.ToInt32() + 2);

Ma dubito che questa affermazione sia valida anche per macchine a 64-bit (dato che l'indirizzamento è a 64-bit lì) ..

Ho trovato questo elegante metodo per aggiungere offset, ma sfortunatamente è in .NET 4.0 solo http://msdn.microsoft.com/en-us/library/system.intptr.add%28VS.100%29.aspx



Puoi utilizzare un metodo di estensione:

public static IntPtrExtensions {
    public static IntPtr Add( this IntPtr ptr, int offSet ) {
        IntPtr ret = new IntPtr( ptr.ToInt64() + offSet );
        return ret;
    }
}
// ... somewhere else ...
IntPtr pointer = GetHandle().Add( 15 );

Ti suggerisco di usare ToInt64 () e a lungo per eseguire il tuo calcolo. In questo modo si eviterà il problema nella versione a 64 bit del framework .NET.

IntPtr ptr = new IntPtr(oldptr.ToInt64() + 2);

Questo aggiunge un po 'di overhead al sistema a 32 bit, ma è più sicuro.







interop