2012-09-12 11 views
7

En mi C# DLL Tengo algo de código como este para interactuar con algunos archivos DLL no administrados:IntPtr.ToInt32() y x64 sistemas

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

Esto siempre ha funcionado bien cuando uso el archivo DLL compilado en Cualquier CPU con .NET2 y .Net4 en sistemas x64, antes de instalar Windows 8.

Con Windows 8 cuando utilizo .Net4 dll obtengo una excepción OverFlowException ("Operación aritmética resultó en un desbordamiento.") en la llamada buffer.ToInt32().

La documentación de MSDN para IntPtr.ToInt32() dice esto:

"OverflowException: En una plataforma de 64 bits, el valor de esta instancia es demasiado grande o demasiado pequeño para representar como un entero de 32 bits con signo "

Me pregunto por qué este problema ha surgido solo con Windows 8, y cuál es la forma correcta de solucionarlo.

¿Debo usar un método como este, en lugar de la llamada IntPtr.ToInt32()?

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

      return ptr.ToInt32(); 

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

* * Siempre use ToInt64(). O lanzar a (largo). –

+0

Muchas gracias – devdept2

+0

Hans Passant, por favor publíquelo como la respuesta. – Idan

Respuesta

1

No debe llamar a ninguna de las funciones de conversión solo para agregar y compensar e inmediatamente convertir de nuevo. IntPtr tiene dos formas integradas para añadir directamente una compensación, ya sea de

IntPtr.Add(buffer, index)

o simplemente

(buffer + index)

Cuestiones relacionadas