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
}
* * Sempre utilizzare ToInt64(). O lanciare a (lungo). –
Grazie mille – devdept2
Hans Passant, per favore pubblicale come risposta. – Idan