这是WPF SplashScreen类中的一个错误。不过在周围.NET 4.6 BitmapHandle是的SafeHandle类,其ReleaseHandle()方法是这样的:
protected override bool ReleaseHandle()
{
return UnsafeNativeMethods.DeleteObject(handle);
}
这是相当正确的,它保证了GDI位图对象正确销毁无论发生什么事情。该缺陷存在于SplashScreen.DestroyResources()方法,它可以帮助太多:
private void DestroyResources()
{
//...
if (_hBitmap != null && !_hBitmap.IsClosed)
{
UnsafeNativeMethods.DeleteObject(_hBitmap.MakeHandleRef(null).Handle);
_hBitmap.Close();
_hBitmap = null;
}
//...
}
两个呼叫DeleteObject
,这是太多了。调试器有一个MDA(托管调试助手),监视这样的错误,它看到ReleaseHandle()失败并进入。你通常不会看到这个,因为(不明智)MDA默认关闭。调试>例外>托管调试助手> ReleaseHandleFailed。取消它以停止获取通知。
像这样的错误是非常讨厌的,他们打开了处理回收攻击的大门。然而,实际可利用的可能性非常低,Close()调用紧跟在DeleteObject()调用之后,并且位图不是特别危险:)事故在技术上是可行的,您必须有另一个线程创建GDI对象时间,这并不经常发生在WPF应用程序中。
你可以在connect.microsoft.com上提交错误,这个Q + A的链接应该足够了。
我也有这个错误,以及迁移到4.0后。你找到了解决方案? – joerage
我发现在我的情况下它与启动屏幕有关。如果我没有启动闪屏,错误消失。 – joerage
你说得对,对我来说也是一样。虽然很奇怪......我现在删除了启动画面。 – metacircle