【问题标题】:Editing XAML leads Visual Studio's Designer to crash编辑 XAML 导致 Visual Studio 的设计器崩溃
【发布时间】:2015-02-18 10:30:13
【问题描述】:

原始问题


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

我每次使用设计器时都会遇到很多崩溃:点击一个元素,更改其位置,甚至更改其名称都会导致崩溃,并显示以下异常:

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 代码,但我无法确定问题的根源。请参阅下面的完整堆栈跟踪:

此外,这是发生错误的确切行和异常详细信息。请注意,文件是VSIsolationProviderService.cs,感谢.NET Reflector Object Browser,我可以看到源代码。

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

最后,出现异常时的Local Variables 检查器显示以下对象:

对象结束:

对cmets的回答:

  • 发生异常的行this._targetFrameworkProvider的值如下。

【问题讨论】:

  • 你有 AnkhSVN 插件吗?
  • @Muds 我不知道在哪里可以检查这个,但我很确定不是。我在 Visual Studio 之外使用 TortoiseSVN
  • 您使用的实际 XAML 是什么?你能做一个重现错误的小项目吗?
  • @JJS 我使用的 XAML 是一个大项目的一部分。我的整个团队都遇到了设计师崩溃的问题。我已经能够通过 GetRuntimeType ( puu.sh/hssuL/4919e1cee5.png ) 方法确定崩溃发生了。我开始认为这是VS2010的一个错误。
  • 您也可以发布活动日志吗? blogs.msdn.com/b/visualstudio/archive/2010/02/24/…

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


【解决方案1】:

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

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

【讨论】:

  • 你做到了!断点不起作用,但捕获 ArgumentNullException 非常有效。所以我发现了异常,但我不知道该怎么做,因为我有机器代码:puu.sh/hsst3/1119ca74e2.png 另外,这是新的堆栈跟踪:puu.sh/hssuL/4919e1cee5.png 有什么想法吗?
  • 接近 :) 去 Debug->Windows->Locals 应该显示当前堆栈帧中的变量(包括希望参数)。查找“实例化”的值以查找违规类型。如果变量没有值(由于优化),则向上堆栈(从顶部开始双击各个帧)。每次切换帧时,locals 窗口都应该显示新变量……希望你会找到一种类型,它会告诉你有问题的控件。
  • 我已经编辑了我的答案并添加了您所询问内容的屏幕截图。我找不到instanciation 参数,你能更准确一点吗?谢谢您的帮助。 ;)
  • 我认为你应该检查this_targetFrameworkProvider是否为空
【解决方案2】:

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

让我首先向您展示一种重现此问题的方法;如果这是您看到的相同问题。 (我使用的是 VS 2013,它处理这个问题比 vs 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,并一次取出任何第 3 方/自定义控件的一个。这些控件之一可能会引发异常,从而产生您所看到的内容。如果它是 Telerik 控件之一,则可以选择与它们联系。

【讨论】:

  • 感谢您的回答。我相信这确实是问题,因为几个人有同样的问题,但我不能隔离一个组件。我的XAML包含很多组件,每次打开设计器检查,都要10秒崩溃。
  • 大约一年前,我正在为旧的 WPF 应用程序重新构建 UI;它有同样的问题。我关闭了解决方案,并以独立方式打开了 xaml 文件。 VS 甚至没有启动设计器,因此我首先消除了 xaml 的大部分区域,试图快速缩小范围。然后专注于个人控制。整个过程确实需要一段时间,我认为大约需要一天。我通过从第 3 部分控件派生控件并在可能的情况下覆盖违规方法来处理一些异常。
【解决方案3】:

正如 Gavin 之前所说,尝试找出问题所在。

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

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

此解决方案将在没有设计器的情况下打开 .xaml 文件,但使用(一些)智能感知。

【讨论】:

    【解决方案4】:

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

    阅读This,你可以尝试一些随机的东西..

    【讨论】:

    • 感谢您的回答。我尝试了一切,即使不是以管理员身份运行 Visual Studio,我也遇到了同样的问题。
    • 很抱歉在这种情况下没有用。
    【解决方案5】:

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

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

    希望对你有所帮助。

    【讨论】:

    • 我不认为XAMLPad 可以处理 Telerik 组件,但感谢您的建议。
    【解决方案6】:

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

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

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

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

    【讨论】:

    • 一旦您通过 CallStack 与问题的来源隔离开来,您可以禁用 Debug Just my code 以进入 dotnet 框架或第三方库(如果您有 PDB)。 Just My Code
    【解决方案7】:

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

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

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

    What causes the VS 2010 SP1 WPF Designer to crash?

    【讨论】:

    • 冒犯控制,你是指我的RadWindow 吗?如果是这样,设计师将如何展示它?
    • 是的,RadWindow。我不知道确切的行为。这可能行不通。
    • 我会尽力通知您。
    【解决方案8】:

    尝试使用 typeof(Type) as 初始化 runtimeType 对象

    Type runtimeType = typeof(Type)
    

    还在调试期间评估变量reflectionType,this,this._targetFrameworkProvider and this._targetFrameworkProvider.GetRunTimeType(reflectionType) 的值。

    这可能会对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多