编辑XAML会导致Visual Studio的设计师崩溃。

20

原问题


我正在使用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)
[...]

我尝试了以下几件事情:

  • 卸载并重新安装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

目标框架提供程序是 null 吗? - JJS
你能否在VS2012或VS2013中重现这个问题? - JJS
@JJS 我没有也无法安装更高版本的VS。你能具体说明一下_targetFrameworkProvider是指什么吗?我明天会回答你。 - Chostakovitch
你尝试过完全删除/重新安装正在使用的所有第三方库吗? - JJS
@JJS 我可以告诉你,我试过了。就像我写的那样,我完全卸载并重新安装了 Telerik,这是我使用的唯一第三方库。 - Chostakovitch
显示剩余12条评论
8个回答

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

你做到了! 断点不起作用,但捕捉ArgumentNullException完美运作。所以我捕获了异常,但不知道该怎么办因为我有机器代码:http://puu.sh/hsst3/1119ca74e2.png此外,这是新的堆栈跟踪: http://puu.sh/hssuL/4919e1cee5.png 有什么想法吗? - Chostakovitch
快了: 转到调试->窗口->本地变量 这应该会显示当前堆栈帧中的变量(包括参数)。查找“实例化”的值以找到有问题的类型。如果变量没有值(由于优化),则向上移动堆栈(从顶部开始双击单个帧)。每次切换帧时,本地变量窗口都应该显示新变量...希望您能找到一个类型,告诉您有问题的控件。 - Mo the Conqueror
我已经编辑了我的答案,并添加了你要求的截图。我找不到“instanciation”参数,你能更明确一些吗?谢谢你的帮助。;) - Chostakovitch
我认为你应该检查this_targetFrameworkProvider是否为空。 - csharpwinphonexaml

6
我相信你所遇到的问题与你正在使用的控件有关。
首先,让我展示一种重现这个问题的方法,看看是否是你遇到的相同问题。(我使用的是VS 2013,它比vs 2010处理此问题更好)
首先,我创建了一个自定义控件,它是一个文本框;我有类似以下代码的代码。
public class CustomTextBox : TextBox
{
    public string testText { get; set; }

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

然后我将这个控件放置到XAML中。
<Grid>
    <local:CustomTextBox/>
</Grid>

我所做的只是在控件调用其构造函数时(当设计器试图新建并呈现它时),如果属性为空,则抛出异常。
在VS2013中,我只是在XAML本身下面有一条红线,但从过去使用VS2010的经验来看,这个问题确实会导致设计器崩溃。
我建议您在没有设计器的情况下逐个删除XAML中的第三方/自定义控件。其中一个控件可能会抛出异常,从而产生您所看到的结果。如果其中一个是Telerik控件,则可以联系他们。

谢谢您的回答。我相信这确实是问题所在,因为有几个人都遇到了同样的问题,但我无法确定是哪个组件出了问题。我的XAML包含了很多组件,每次我打开设计师检查时,它都需要10秒钟就崩溃了。 - Chostakovitch
1
大约一年前,我在重建一个旧的WPF应用程序的UI时遇到了同样的问题。我关闭了解决方案,并以独立方式打开了xaml文件。VS甚至没有启动设计师,因此我开始通过尝试消除大量的xaml来快速缩小范围。然后专注于单个控件。整个过程确实需要一段时间,我想大约需要一天时间。其中一些异常情况是通过从第三方控件派生控件并在可能的情况下覆盖有问题的方法来处理的。 - Gavin Lanata

2

正如Gavin之前所说,尝试找到引起问题的控件。

如果您右键单击.xaml文件,选择使用...打开方式并选择源代码(文本)编辑器,则仍然可以在VS中编辑文件。

如果您预计会在许多文件中遇到此类问题,则可以将其设置为默认选项,并在完成后切换回其他选项。

这种解决方案将以没有设计器,但具有一些感知能力的方式打开.xaml文件。


1

我不认为XAMLPad能够处理Telerik组件,但是谢谢你的建议。 - Chostakovitch

1
如果您认为它可能与您正在使用的组件有关,您可以尝试调试Visual Studio设计模式,并查看在哪种情况下会引发ArgumentNullException,或者至少在引发异常时获取CallStack。
请参阅此链接: 如何解决和调试Visual Studio设计模式错误? 我个人用Blend的一个实例和一个Visual Studio的实例来完成,而不是两个Visual Studio的实例。
我还会尝试从完全新的项目开始,没有任何外部依赖项,以查看它是否与您的Visual Studio安装有关。

一旦您通过调用堆栈确定了问题的来源,如果您有PDB文件,您可以禁用“仅调试我的代码”以进入dotnet框架或第三方库。仅调试我的代码 - Jonathan Naim

1

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

阅读这篇文章,里面有一些随机的事情可以尝试..


谢谢你的回答。我尝试了所有方法,甚至以非管理员身份运行Visual Studio,但问题仍然存在。 - Chostakovitch
很抱歉这次无法提供帮助。 - Muds

0

使用特定的XAML文件可能会导致VS2010崩溃,这是一个相当常见的问题。

您是否尝试在有问题的控件的“Load事件”中添加以下代码?

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

什么原因导致VS 2010 SP1 WPF设计师崩溃?


你所说的“offending control”是指我的RadWindow吗?如果是,设计师将如何显示它? - Chostakovitch
是的,RadWindow。我不确定其确切行为。可能这不起作用。 - JJS
我会尽力让您保持了解情况。 - Chostakovitch

0

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

Type runtimeType = typeof(Type)

在调试过程中,可以通过观察窗口评估变量reflectionType、this、this._targetFrameworkProviderthis._targetFrameworkProvider.GetRunTimeType(reflectionType)的值。

这可能会对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接