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
}
* * Siempre use ToInt64(). O lanzar a (largo). –
Muchas gracias – devdept2
Hans Passant, por favor publíquelo como la respuesta. – Idan