Windows 8 IntPtr.ToInt32()和x64系统
在我的c#dll中,我有一些这样的代码与一些非托管dll交互: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
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
}