構成 (OS、グラフィックス カード、およびメモリ) が異なる特定のマシンでは、OutOfMemory 例外が発生します。一部のテストでは、消費される仮想メモリが大幅に増加していないことが示されました。それは、例外が発生するコードの一部です。
public override Size GetPreferredSize(Size proposedSize)
{
try
{
using (Graphics g = this.CreateGraphics())
{
SizeF measured = g.MeasureString(this.Text, this.Font); // <= OutOfMemoryException
measured += new SizeF(1, 1);
return measured.ToSize();
}
}
catch (OutOfMemoryException oom)
{
System.Diagnostics.Trace.WriteLine(oom.ToString());
}
return proposedSize;
}
クラスは label から直接派生します。
CreateGraphics() は、GDI+ 関数 GdipCreateFromHWND を呼び出します。これは、場合によっては、私が直面している OutOfMemoryException を発生させるステータス (3) を返す可能性があります。
[EditorBrowsable(EditorBrowsableState.Advanced), SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
public static Graphics FromHwndInternal(IntPtr hwnd)
{
IntPtr zero = IntPtr.Zero;
int status = SafeNativeMethods.Gdip.GdipCreateFromHWND(new HandleRef(null, hwnd), out zero);
if (status != 0)
{
throw SafeNativeMethods.Gdip.StatusException(status); // status = 3 throws an OutOfMemoryException with text "Out of memory"
}
return new Graphics(zero);
}
しかし、残念ながら、メモリ不足を返す関数とケースに関するドキュメントは見つかりませんでした。
この問題は、少なくとも 1 台の顧客のマシンで非常に高速に再現可能です。彼がしなければならないことは、この派生した Label の 1 つが配置され、WebBrowser コントロールにコンテンツを表示するために使用される新しいウィンドウを作成するボタンをクリックすることだけです。
例外の理由を見つけるのに役立つアイデアがあれば、それは素晴らしいことです!
乾杯、マイケル