Windows 8 IntPtr.ToInt32()和x64系统

Windows 8 IntPtr.ToInt32()和x64系统,windows-8,64-bit,intptr,overflowexception,Windows 8,64 Bit,Intptr,Overflowexception,在我的c#dll中,我有一些这样的代码与一些非托管dll交互: IntPtr buffer = ...; TTPOLYGONHEADER header = (TTPOLYGONHEADER)Marshal.PtrToStructure( new IntPtr(buffer.ToInt32() + index), typeof(TTPOLYGONHEADER)); 在安装Windows 8之前,在x64系统上使用在AnyCPU中编译的.Net2和.N

在我的c#dll中,我有一些这样的代码与一些非托管dll交互:

IntPtr buffer = ...;
TTPOLYGONHEADER header = (TTPOLYGONHEADER)Marshal.PtrToStructure(
                       new IntPtr(buffer.ToInt32() + index), typeof(TTPOLYGONHEADER));
在安装Windows 8之前,在x64系统上使用在AnyCPU中编译的.Net2和.Net4的dll时,这总是很好地工作

在Windows 8中,当使用.Net4 dll时,我在buffer.ToInt32()调用中得到OverFlowException(“算术运算导致溢出”)

IntPtr.ToInt32()的MSDN文档说明:

OverflowException:在64位平台上,此实例的值太大或太小,无法表示为32位有符号整数

我想知道为什么只有Windows 8才出现这个问题,以及如何正确地解决它

我应该使用这样的方法,而不是IntPtr.ToInt32()调用吗


您不应该调用任何转换函数只是为了添加和偏移并立即转换回
IntPtr
有两种内置方法可直接添加偏移量,即

或者干脆


始终使用ToInt64()。或投(长)。汉斯·帕桑,请把它作为答案贴出来。
    internal static long GetPtr(IntPtr ptr)
    {
        if (IntPtr.Size == 4) // x86

            return ptr.ToInt32();

        return ptr.ToInt64(); // x64
    }