编辑XAML导致Visual Studio的Designer崩溃

Cho*_*tch 20 c# wpf xaml visual-studio-2010

原始问题


我正在使用Visual Studio 2010处理WPF应用程序Telerik.

每次我使用设计器时,我一直在处理很多崩溃:点击一个元素,改变它的位置,甚至改变它的名字都会导致崩溃,并显示以下异常:

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)
[...]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下事项:

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

这些尝试都没有奏效.

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

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

我的猜测是,当Visual Studio试图将XAML代码 "转换" 为设计器中的图形元素时,出现问题,并且仅在该方向上.


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

先感谢您.


阅读答案后做了新的尝试

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

在此输入图像描述

此外,这是发生错误的确切行和异常详细信息.请注意,该文件是VSIsolationProviderService.cs,并且我能够看到源代码,这要归功于.NET Reflector Object Browser.

在此输入图像描述

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

最后,Local VariablesException时刻的检查员显示以下对象:

在此输入图像描述

对象结束:

在此输入图像描述

评论的答案:

  • this._targetFrameworkProvider发生异常的行的值如下. 在此输入图像描述

小智 9

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

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


小智 6

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

让我首先向您展示一种再现这个问题的方法; 如果你看到同样的问题.(我使用VS 2013处理这个问题比2010年好一点)

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

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

    public CustomTextBox()
        : base()
    {
        if (string.IsNullOrEmpty(testText))
        {
            throw new ArgumentNullException();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我把这个控件放到了xaml中

<Grid>
    <local:CustomTextBox/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

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

在VS2013中,我只是在XAML本身的控件下面有一条红线,但是根据VS2010的过去经验,这个问题确实导致设计师倒闭.

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


Mud*_*uds 1

另外,我在某处读到,如果您以管理员身份启动,则会出现问题,请尝试以管理员身份启动 Visual Studio

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