40

这是功能:

public void Init(System.Type Type) {
    this.Type = Type;
    BuildFieldAttributes();
    BuildDataColumns(FieldAttributes);
}

我在第一行 ( this.Type = Type) 上设置了一个断点,我想在什么时候中断,Type.FullName == "Malt.Organisation"这就是我输入的条件。

但是,当该行被击中时会显示以下错误:

断点的条件未能执行。条件是 'Type.FullName == "Malt.Organisation"'。返回的错误是“在此上下文中不支持在 System.Type 类型的调试对象中检查对象的状态。”

我做错了什么(明显的)事情?

PS。一种解决方法是将其添加到代码中:

if (Type.FullName == "Malt.Organisation") System.Diagnostics.Debugger.Break();
4

4 回答 4

54

就我而言,我使用的是 Visual Studio 2013、NUnit 2.6.4,并将调试器附加到单元测试会话中,我收到了类似的消息:

断点的条件未能执行。条件是'type.Name.Contains("FooBar")'。返回的错误是“在此上下文中不支持检查 System.Type 类型的调试对象中对象的状态。”。单击确定在此断点处停止。

这显然是由于微软引入的新调试引擎中缺少一个功能造成的。按照这个 msdn blogpost的说明,我开始工作了。说明归结为:

  1. 从“工具”菜单中打开“选项
  2. 在左侧选择“调试”,“常规
  3. 一直向下滚动以选中“使用托管兼容模式

这应该切换到旧版调试引擎,在我的情况下,它允许在断点条件下键入表达式。请注意,显然您确实需要重新启动您的应用程序或调试会话。

免责声明:我不知道检查此选项的其他效果。就个人而言,当我完成需要它的任务时,我将其关闭了......

于 2016-03-14T09:39:20.563 回答
4

你说这Type.FullName == "Malt.Organisation"会导致它破裂,你试过this.Type.FullName == "Malt.Organisation"吗?

另一种可能性,调试器是否认为您正在尝试使用名为 Type 的变量来调用静态方法,就像它的类名一样?将 Type 变量重命名为其他内容是否可以解决问题?

于 2015-08-28T18:13:57.833 回答
3

我遇到了这个问题,但是在 Web 应用程序中测试 IsInterface 时。而不是在调试器中启用额外的功能,我只是作弊。

bool blnIsInterface = tType.IsInterface;

//Insert breakpoint here...
if(blnIsInterface)
{
    ...
}

所以在你的情况下你可以做类似的事情

public void Init(System.Type Type) {
    bool blnBreak = Type.FullName == "Malt.Organisation";
    //insert breakpoint of blnBreak == true
    this.Type = Type;
    BuildFieldAttributes();
    BuildDataColumns(FieldAttributes);
}

这有点麻烦,但至少您不必担心性能下降,并且启用本机代码调试似乎不是 Web 应用程序中的一个选项。

于 2017-05-24T01:05:49.353 回答
1

我不确定此处描述的“使用托管兼容模式”解决方案 - 对我没有帮助,但在我自己的情况下Project > Properties > Debug > Enable Native code debugging- 必须取消选中。

为什么 - 目前没有线索。

正在使用 .net 4.5、vs2015、控制台应用程序。

于 2017-05-03T19:39:05.317 回答