使用MS代码合约时,VS2010调试器窗口会丢失类型分辨率

时间:2011-07-08 14:20:10

标签: visual-studio-2010 debugging code-contracts

自从开始使用Code Contracts(.NET 4.0,VS2010 Ultimate& Premium)以来,我们在调试器窗口中遇到了一个奇怪的问题。

我有一个带有一个可执行文件的简单解决方案,一个使用代码约定的库,另一个库没有。每个库包含一个类,在类的构造函数中,它初始化一个整数列表。如果我们在列表初始化之后放置一个断点并在调试器窗口(包括即时窗口)中查看它,我们可以看到值很好。但是,如果我们尝试将值转换为其显式类型,则会中断。

在未使用代码约定的库中,以下适用于调试器窗口:

(List<int>)nums

在使用代码约定的库中,这会生成“类型或命名空间'列表'在此范围内无效'。我们必须执行以下操作才能使其工作:

(System.Collections.Generic.List<int>)nums

请注意,代码工作正常,没有问题,问题只出现在调试器窗口中。

更新:似乎唯一有效的设置是项目属性中“代码合同”选项卡上的“执行运行时合同检查”旁边的复选框。在查看ILSpy中的代码后,我发现添加到assemblyinfo.cs的属性,属性(RuntimeContractsAttribute)和枚举(RuntimeContractsFlags),添加到我的项目中。一时兴起,我从ILSpy复制了这些项目的代码并创建了我自己的版本。现在,一切正常。但是,当我选择“构建”合同引用程序集时,构建失败。 (我假设引用生成器正在尝试添加编译器生成的代码,而炸弹导致我手动添加它。)但是,如果不手动添加运行时代码,无论Build Contract Reference Assembly设置如何,调试器仍然会失败。

2 个答案:

答案 0 :(得分:0)

重要的两个库之间的区别不在于它们是否使用Code Contracts库,而是在调试器被破坏的代码文件中是否有using System.Collections.Generic;语句。

Visual Studio调试器尽力评估表达式,就好像你要在你正在破解的代码行上编写该表达式,并且包括尊重该行代码的词法范围;如果您尝试在没有List<int>的文件中转换为using System.Collections.Generic;,那么也会失败并出现错误。

答案 1 :(得分:0)

是的,这是一个已知问题。在程序集的pdb中有一些我们可能无法正确维护的调试信息,与给定点的范围内的使用集有关。这会影响调试器在范围内所假设的内容,从而影响您遇到的问题。