当社のソフトウェアは技術図面をレンダリングします。 1つの特定の図面は、OutOfMemoryExceptionで毎回アプリケーションをクラッシュさせました。調査の結果、何も普通のようには見えなかった。アプリケーションは、多くのメモリを要求していない、ハンドルの多くを使用していない。私は例外をキャッチしようとし、アプリは別のものを投げることなく描画を終了しました。実際には、常に1つしかありませんOutOfMemoryException、それは常にそれを引き起こした同じグラフィックプリミティブでした。Graphics.DrawArcを使用した再現可能なクラッシュ
この特定のクラッシュを引き起こすには、次のコードが最低限必要です。画像サイズ、ペンスタイル、座標の正確な組み合わせが例外を引き起こすようです。 3つの小数点以下を切り捨てると、グラフィックスのサイズを小さくするか、または破線を使わずにペンを使用するように、座標が消えます。
using (Bitmap b = new Bitmap(200, 200))
{
using (Graphics g = Graphics.FromImage(b))
{
using (Pen p = new Pen(Color.Black))
{
p.DashPattern = new float[]{10.0f, 2.0f};
RectangleF r = new RectangleF(
BitConverter.ToSingle(new byte[]{0xD3, 0x56, 0xB3, 0x42}, 0),
BitConverter.ToSingle(new byte[]{0x87, 0x2D, 0x17, 0x43}, 0),
BitConverter.ToSingle(new byte[]{0xE2, 0x81, 0xD1, 0x3F}, 0),
BitConverter.ToSingle(new byte[]{0xE2, 0x81, 0xD1, 0x3F}, 0));
float st = BitConverter.ToSingle(new byte[]{0x6B, 0xF6, 0x1A, 0x42}, 0);
float sw = BitConverter.ToSingle(new byte[]{0x6D, 0x33, 0x4F, 0x40}, 0);
g.DrawArc(p, r, st, sw);
}
}
}
は、このケースでは、回避策を作成するために、複雑ではないですが、誰かがこのについての説明があった場合、私は思っていました。
非常に有益です、ありがとうございます。私には、GDIのエラー報告が非常に限定されているとは思われませんでした。 – waldrumpus