2013-09-23 54 views
1

我們遇到了一個問題,試圖在Visual Studio(2010或2012)中打開特定設計器文件將導致其無法恢復崩潰('Visual Studio已停止工作')。Visual Studio設計器崩潰(在Windows 8上)

附加一個調試器時,這個嘗試的過程中拋出一個System.NullReferenceException,帶有堆棧跟蹤:

at System.Windows.Forms.NativeWindow.AddWindowToTable(IntPtr handle, NativeWindow window) 
at System.Windows.Forms.NativeWindow.AssignHandle(IntPtr handle, Boolean assignUniqueID) 
at System.Windows.Forms.Design.ControlDesigner.ChildSubClass..ctor(ControlDesigner designer, IntPtr hwnd) 
at System.Windows.Forms.Design.ControlDesigner.HookChildHandles(IntPtr firstChild) 
at System.Windows.Forms.Design.ControlDesigner.HookChildControls(Control firstChild) 
at System.Windows.Forms.Design.ControlDesigner.HookChildControls(Control firstChild) 
at System.Windows.Forms.Design.ControlDesigner.HookChildControls(Control firstChild) 
at System.Windows.Forms.Design.ControlDesigner.HookChildControls(Control firstChild) 
at System.Windows.Forms.Design.ControlDesigner.OnHandleChange() 
at System.Windows.Forms.Design.ControlDesigner.DesignerWindowTarget.OnHandleChange(IntPtr newHandle) 
at System.Windows.Forms.Control.ControlNativeWindow.OnHandleChange() 
at System.Windows.Forms.NativeWindow.AssignHandle(IntPtr handle, Boolean assignUniqueID) 
at System.Windows.Forms.NativeWindow.AssignHandle(IntPtr handle) 
at System.Windows.Forms.NativeWindow.WindowClass.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

這個問題一直出現在開發盒子,我們已經更新到Windows 8企業(和現在使用的固態硬盤)。 Windows 7 Professional上的舊盒子始終如此而不是表現出這種行爲。這個問題似乎也只是出現在特定的設計器文件上,儘管它還不清楚爲什麼。

有沒有人有任何建議來解決這個問題,或進一步調查?

+1

在http://connect.microsoft.com/VisualStudio提交錯誤 – Florian

+0

您是否嘗試安裝VS2012 Update 4的RC? – magicandre1981

回答

2

從來沒有完全解決過這個問題,但確實設計了一種解決方法。有一個在錯誤報告我提交更多資訊(從MS): http://connect.microsoft.com/VisualStudio/feedback/details/802088/designer-file-causing-crash-since-update-to-windows-8

綜上所述,MS團隊認爲這是一個「..crash當控件的一個靜態初始化是失敗」

通過試驗和錯誤,我們縮小了問題的範圍,以確定引起問題的控制,然後最小化了它正在執行的初始化(但僅在設計時間內)

爲了最小化初始化,我們添加了一個屬性來檢查控制器正在設計中使用:

private bool IsDesignerHosted 
{ 
    get 
    { 
     if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) return true; 
     Control ctrl = this; 
     while (ctrl != null) 
     { 
      if ((ctrl.Site != null) && ctrl.Site.DesignMode) return true; 
      ctrl = ctrl.Parent; 
     } 
     return false; 
    } 
} 

..然後在設計時使用此屬性來防止控件上的活動。