我们的软件提供技术图纸。一个特定的绘图使应用程序每次都使用 OutOfMemoryException 崩溃。经过调查,似乎没有什么不寻常的;该应用程序没有请求大量的内存,没有使用很多句柄。我尝试捕获异常,应用程序完成绘图而不抛出另一个。实际上,总是只有一个 OutOfMemoryException ,并且它始终是导致它的相同图形基元。
以下代码是导致此特定崩溃所需的最低要求。似乎图像大小,笔样式和坐标的确切组合导致异常。将坐标向下舍入到三位小数会使其消失,就像使图形尺寸更小或使用没有划线的笔一样。
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);
}
}
}
在这种情况下,创建一个变通方法并不复杂,但我想知道是否有人对此有解释。
答案 0 :(得分:4)
System.Drawing是GDI +的一个包装器,GDI +是一个非托管库,早于.NET发布多年。它遇到了C api的典型问题,错误报告相当差。 GDI +只有20个不同的错误代码,对于这么大的代码块来说并不多。它们也非常不透明,特别是Status :: GenericError。对于许多可能没有任何共同点的错误条件,返回了一个非常常见的错误。
System.Drawing可以做很少的事情,使这些错误代码更具描述性,因为它们不是设计描述性的。 Status :: OutOfMemory也适合这种模式。它可以做很少,但生成一个托管异常,意味着同样的事情。遗憾的是,这不是一个很好的选择,因为OutOfMemoryException在.NET中非常具体。
这里有很多失利,只有很少的赢球方式。您只需要以面值来处理GDI +的错误报告并修复问题。在这种情况下很有可能避免使用虚线笔进行非常小的弧线将解决您的问题。无论如何你都看不到破折号模式。