1

我们遇到了一个问题,即尝试在 Visual Studio(2010 或 2012)中打开特定的设计器文件会导致它无法恢复地崩溃(“Visual Studio 已停止工作”)。

尝试执行此操作时将调试器附加到进程会引发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 企业版(现在使用 SSD)的开发盒上。Windows 7 Professional 上的旧盒子始终不会出现这种行为。该问题似乎也只发生在特定的设计器文件上,但目前尚不清楚原因。

有没有人有任何解决这个问题或进一步调查的建议?

4

1 回答 1

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;
    }
}

.. 然后在设计时使用此属性来防止控件上的活动。

于 2014-04-02T12:56:33.917 回答