编辑XAML导致Visual Studio的设计器崩溃

时间:2015-02-18 10:30:13

标签: c# wpf visual-studio-2010 xaml

原始问题


我正在使用Telerik在Visual Studio 2010上使用WPF应用程序。

每次使用设计器时,我一直在处理很多崩溃:单击元素,更改其位置,甚至更改其名称会导致崩溃,并显示以下异常:< / p>

System.ArgumentNullException
Value cannot be null.
   to System.RuntimeType.MakeGenericType(Type[] instantiation)
   to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkUtil.GetRuntimeType(Type type)
   to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkType.TryGetRuntimeType()
   to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkUtil.EnsureRuntimeType(Type type)
   to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkProvider.GetRuntimeType(Type reflectionType)
[...]

我尝试了以下事项:

  • 卸载并重新安装Telerik;
  • 卸载并重新安装.NET 4.0;
  • 卸载并重新安装Visual Studio。

这些尝试都没有奏效。

今天早上,我注意到设计师根本没有崩溃,我明白了原因:当我打开或编辑XAML 时,设计师崩溃

打开XAML后,Visual Studio开始冻结,每次我尝试点击某些内容时设计器都会崩溃。如果我关闭Visual Studio并构建解决方案(而不打开XAML ),一切都可以与设计师合作。

我的猜测是,当Visual Studio试图将 XAML代码“转换为设计器中的图形元素时,出现问题,并且只是朝着那个方向发展。


问题:你有没有尝试过这种事情?您是否知道为什么修改XAML会导致崩溃以及如何解决?

提前谢谢。


阅读答案后做了新的尝试

  • 在设计器打开时调试Visual Studio实例。导致ArgumentNullException的方法是GetRuntimeTime。我已经能够看到.NET代码,但我无法确定问题的根源。请参阅下面的完整堆栈跟踪:

enter image description here

此外,这是发生错误的确切行和异常详细信息。请注意,该文件为VSIsolationProviderService.cs,我可以通过.NET Reflector Object Browser查看来源。

enter image description here

  Message=Value cannot be null.
  Source=mscorlib
  StackTrace:
       to System.RuntimeType.MakeGenericType(Type[] instantiation)
  InnerException: null

最后,异常时Local Variables检查员显示以下对象:

enter image description here

对象结束:

enter image description here

评论答案:

  • 发生异常的行的this._targetFrameworkProvider值如下。 enter image description here

7 个答案:

答案 0 :(得分:9)

我想,最好的办法是调试Visual Studio!

  • 运行Visual Studio(实例#1)并加载解决方案
  • 运行Visual Studio的第二个实例(#2)
  • 来自实例#2 go,Debug-&gt; Attach to process-&gt;选择devenv.exe(实例#1,确保选择托管调试)
  • 然后选择Debug-&gt; Exception,按“Find ..”并搜索System.ArgumentNull然后选中“Thrown”
  • 转到实例#1,在设计器中加载视图,这应该在实例#2中触发断点,它应该显示完整的堆栈跟踪。此信息应足以识别有问题的控件/组件..

答案 1 :(得分:6)

我相信您看到的问题与您正在使用的控件之一有关。

首先让我告诉你一种重现这个问题的方法;如果你看到同样的问题。 (我使用VS 2013处理这个问题比2010年好一点)

首先,我创建了一个自定义控件,它是一个TextBox;我的代码看起来像这样。

public class CustomTextBox : TextBox
{
    public string testText { get; set; }

    public CustomTextBox()
        : base()
    {
        if (string.IsNullOrEmpty(testText))
        {
            throw new ArgumentNullException();
        }
    }
}

然后我将此控件放入xaml

<Grid>
    <local:CustomTextBox/>
</Grid>

当控件调用其构造函数时,当属性为null时,我正在做的就是抛出一个异常(在设计器尝试新建它并渲染它时,它将在设计器中执行)。

在VS2013中,我只是在XAML本身的控件下方有一条红线,但从过去VS2010的经验来看,这个问题确实导致设计师失败。

我建议你做的是在没有设计师的情况下通过XAML并一次取出任何第三方/自定义控件。其中一个控件可能会抛出异常,从而产生您所看到的内容。如果是其中一个Telerik控件,则可以选择联系他们。

答案 2 :(得分:2)

正如Gavin先前所说,试着找到问题的控制。

如果右键单击.xaml文件,您仍然可以编辑VS中的文件,选择Open With并选择Source Code (Text) Editor

如果您希望将其设置为大量文件,可以将其设置为默认值,并在完成后将其切换。

此解决方案将打开.xaml文件而不使用设计器,但使用(某些)intellisense。

答案 3 :(得分:1)

另外,我在某处读到如果你以管理员身份启动vs它会给你带来问题,请尝试启动Visual Studio而不是Admin

阅读This,您可以尝试一些随机的事情......

答案 4 :(得分:1)

您可以尝试使用XAMLPAD来测试您的XAML页面。

参考:https://msdn.microsoft.com/en-us/library/vstudio/ms742398(v=vs.90).aspx

希望这会对你有所帮助。

答案 5 :(得分:1)

如果您认为它可能与您正在使用的组件有关,您可能需要尝试调试Visual Studio设计模式并查看在哪种情况下抛出ArgumentNullException或至少在何时获取CallStack抛出异常。

查看此链接: How to troubleshoot and debug Visual Studio design mode errors?

我个人使用Blend实例和一个Visual Studio实例而不是两个Visual Studio实例。

我还会尝试从一个没有任何外部依赖关系的完整新项目来查看它是否与您的Visual Studio安装相关

答案 6 :(得分:0)

VS2010打破某些XAML是一个众所周知的问题。

您是否尝试将此代码添加到违规控件的加载事件中?

if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) { return; }

What causes the VS 2010 SP1 WPF Designer to crash?