2012-09-12 12 views
7

Nel mio C# dll ho qualche codice come questo di interagire con alcune DLL non gestite:IntPtr.ToInt32() e x64 sistemi

IntPtr buffer = ...; 
TTPOLYGONHEADER header = (TTPOLYGONHEADER)Marshal.PtrToStructure(
         new IntPtr(buffer.ToInt32() + index), typeof(TTPOLYGONHEADER)); 

Questo ha sempre lavorato bene quando si utilizza il DLL compilata in AnyCPU con .NET2 e .Net4 su sistemi x64, prima di installare Windows 8.

Con Windows 8 quando si utilizza .Net4 dll Ricevo una OverFlowException ("Operazione aritmetica ha generato un overflow.") alla chiamata buffer.ToInt32().

La documentazione MSDN per IntPtr.ToInt32() dice questo:

"OverflowException: Su una piattaforma a 64 bit, il valore di questa istanza è troppo grande o troppo piccolo per rappresentare come intero con segno a 32 bit ".

Mi chiedo perché questo problema è emerso solo con Windows 8 e qual è il modo corretto per risolverlo.

Devo utilizzare un metodo come questo, invece della chiamata IntPtr.ToInt32()?

internal static long GetPtr(IntPtr ptr) 
    { 
     if (IntPtr.Size == 4) // x86 

      return ptr.ToInt32(); 

     return ptr.ToInt64(); // x64 
    } 
+6

* * Sempre utilizzare ToInt64(). O lanciare a (lungo). –

+0

Grazie mille – devdept2

+0

Hans Passant, per favore pubblicale come risposta. – Idan

risposta

1

Non si deve chiamare nessuna delle funzioni di conversione solo per aggiungere e sfalsare e riconvertire immediatamente. IntPtr ha due modi incorporati per aggiungere direttamente un offset, uno di

IntPtr.Add(buffer, index)

o semplicemente

(buffer + index)