自从开始使用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设置如何,调试器仍然会失败。
答案 0 :(得分:0)
重要的两个库之间的区别不在于它们是否使用Code Contracts库,而是在调试器被破坏的代码文件中是否有using System.Collections.Generic;
语句。
Visual Studio调试器尽力评估表达式,就好像你要在你正在破解的代码行上编写该表达式,并且包括尊重该行代码的词法范围;如果您尝试在没有List<int>
的文件中转换为using System.Collections.Generic;
,那么也会失败并出现错误。
答案 1 :(得分:0)
是的,这是一个已知问题。在程序集的pdb中有一些我们可能无法正确维护的调试信息,与给定点的范围内的使用集有关。这会影响调试器在范围内所假设的内容,从而影响您遇到的问题。