7

私の 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
    }
4

1 に答える 1

2

追加してオフセットし、すぐに元に戻すためだけに、変換関数を呼び出すべきではありません。 には、オフセットを直接追加する組み込みの方法IntPtr2 つあります。

IntPtr.Add(buffer, index)

または単に

(buffer + index)

于 2016-05-19T02:45:31.457 に答える