IntPtr.ToInt32()和x64系统

时间:2012-09-12 14:06:05

标签: 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和.Net4编译的dll时,这一直都能正常工作。

在使用.Net4 dll的Windows 8中,我在buffer.ToInt32()调用时遇到OverFlowException(“算术操作导致溢出。”)。

IntPtr.ToInt32()的MSDN文档说明了这一点:

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

我想知道为什么这个问题只出现在Windows 8上,解决问题的正确方法是什么。

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

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

            return ptr.ToInt32();

        return ptr.ToInt64(); // x64
    }

1 个答案:

答案 0 :(得分:1)

您不应仅仅为了添加和偏移而调用任何转换函数并立即转换回来。 IntPtr两种内置方式直接添加偏移量,

IntPtr.Add(buffer, index)

或只是

(buffer + index)