私の c# dll には、いくつかのアンマネージ dll とやり取りするための次のようなコードがあります。
IntPtr buffer = ...;
TTPOLYGONHEADER header = (TTPOLYGONHEADER)Marshal.PtrToStructure(
new IntPtr(buffer.ToInt32() + index), typeof(TTPOLYGONHEADER));
Windows 8をインストールする前に、x64システムで.Net2および.Net4を使用してAnyCPUでコンパイルされた私のdllを使用すると、これは常に正常に機能しました。
Windows 8 で .Net4 dll を使用すると、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
}