2012-09-12 53 views
7

在我的C#DLL我有一些這樣的代碼與一些託管DLL互動:IntPtr.ToInt32()和x64系統

IntPtr buffer = ...; 
TTPOLYGONHEADER header = (TTPOLYGONHEADER)Marshal.PtrToStructure(
         new IntPtr(buffer.ToInt32() + index), typeof(TTPOLYGONHEADER)); 

用我的DLL中AnyCPU與.NET2編譯時,這一直工作得很好和.Net4在x64系統上安裝Windows 8之前。

使用Windows 8時使用.net4 dll我得到一個OverFlowException(「算術運算導致溢出」)在buffer.ToInt32()調用。

爲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 
    } 
+6

*始終*使用ToInt64()。或投到(長)。 –

+0

非常感謝 – devdept2

+0

Hans Passant,請把它作爲答案。 – Idan

回答

1

您不應該調用任何轉換函數來添加和偏移,並立即轉換回來。 IntPtr有內置的方式,直接加一個偏移量,無論是的

IntPtr.Add(buffer, index)

或者乾脆

(buffer + index)

相關問題