有一個老的bug在.NET 2.0。但是,此錯誤僅在終端服務器或遠程桌面/協助會話下發生。
更多信息和解決方法: http://support.microsoft.com/kb/953389
更新一月2017微軟已經刪除了KB953389文章。它仍然在一些搜索引擎的緩存中。
這裏是什麼,是說:
行動
您正在運行Microsoft .NET Framework 2.0的Windows窗體在終端服務器會話的應用程序。然後,最小化終端服務器會話窗口,從會話斷開連接或鎖定會話。 結果
當在終端服務器會話恢復工作時,Windows窗體應用程序顯示以下異常和調用堆棧:
System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
at System.Drawing.Graphics.Clear(Color color)
at System.Windows.Forms.ToolStripProfessionalRenderer.OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e)
at System.Windows.Forms.ToolStripProfessionalRenderer.OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e)
at System.Windows.Forms.ToolStripRenderer.DrawToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e)
at System.Windows.Forms.ToolStripContentPanel.OnPaintBackground(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmEraseBkgnd(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
原因
這是由於微軟的錯誤.NET Framework 2.0。 Windows窗體運行時正試圖調用System.Drawing.Graphics.Clear,而不檢查它是否在安全桌面上運行。如以下MSDN鏈接中所述,如果在終端服務器會話中的安全桌面上調用Clear方法,則可能會發生ExternalException,從而使Graphics對象處於不一致狀態。
Graphics.Clear方法
http://msdn.microsoft.com/en-us/library/system.drawing.graphics.clear.aspx
分辨率
可以解決此問題由佈線事件處理程序的Application.ThreadException事件。此事件允許您的應用程序代碼處理Windows窗體線程中發生的其他未處理的異常。這將允許您的代碼被調用,而不是顯示標準的Windows窗體異常對話框。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler Application.ThreadException, AddressOf Application_ThreadException
End Sub
Sub Application_ThreadException(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
If TypeOf (e.Exception) Is System.Runtime.InteropServices.ExternalException Then
Return
End If
MessageBox.Show(e.Exception.Message, Me.Text)
End Sub
GDI +異常非常糟糕,但這幾乎總是一個權限問題。 100%確切地知道*文件正在寫入哪裏,並且用戶對服務器共享有適當的權限。而且他們試圖寫入的文件可能不會被網絡上的另一臺機器鎖定。 –