.NET 3.5 的代码合同弄乱了 VS10 的调试器

Posted

技术标签:

【中文标题】.NET 3.5 的代码合同弄乱了 VS10 的调试器【英文标题】:Code contracts for .NET 3.5 messes up VS10's debugger 【发布时间】:2011-03-12 14:28:55 【问题描述】:

我最近使用代码协定迁移了许多手动前置条件测试和异常抛出。我没有升级到 .NET 4,而是一直在使用 Microsoft.Contracts.dll 程序集,因此我可以坚持使用 .NET 3.5 更长时间(这是一个同时被 .NET 3.5 和 .NET 4 程序集使用的库)。我在 Visual Studio 2010 中设置了合同重写器,合同工作得很好。

但是,自从我完成了该切换后,我注意到调试器在带有协定的方法中表现得非常有趣,尤其是在带有 ContractInvariantMethod 的类中。执行光标似乎并不总是与突出显示的行匹配,一些断点未能命中,而且我有一个方法,其中调试器无法告诉局部变量名称,并且会显示类似CS$1$0000 的内容。这是在调试版本中。

在 .NET 3.5 到 VS10 中使用 Microsoft.Contracts.dll 中的代码协定是否存在已知问题? .NET 4 中的代码契约是否会出现类似问题?

[编辑] 这个问题导致我在 Microsoft Connect 上创建了一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/573983/code-contract-rewriting-messes-up-local-variable-names-in-iterator-methods-while-debugging

【问题讨论】:

[OT] 很棒的用户名 :) 【参考方案1】:

我希望您知道合约重写意味着什么——动态生成的额外代码,没有任何源代码供编译器锁定。由于 CLR 有这么多不同的元素,因此调试器有很多事情要么根本不会做,要么会感到困惑,只有具有广泛影响的成熟语言功能才能获得完整调试器支持的预算。例如像 lambda 表达式。

这并不是说提交错误不是一个好的原因,只是当您使用尚未完全开发的方面时,您不应该期望任何事情会变得更好。作为早期采用者总是有这样的成本,但也有吹牛的权利:-)

【讨论】:

是的,我知道外部工具必须与 IL 配合使用并四处移动。自从问了这个问题后,我迁移到了 .NET 4 并且再也没有被这个问题所困扰。我猜.NET 3.5 的代码合同工具在这方面是不完整的。【参考方案2】:

请记住,代码合同目前不适用于 Post 条件和多线程。 限制合约只做前提条件重写。 这解决了我们系统中的很多问题。

【讨论】:

其实在我的情况下,简单地开启合约重写,即使重写设置为无,也会导致问题。所以后置条件不是问题,我没有做任何多线程。

以上是关于.NET 3.5 的代码合同弄乱了 VS10 的调试器的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QTextBrowser 弄乱了我的 HTML 代码?

Perl 5.10 是不是把原型弄乱了?

ckeditor在保存时弄乱了代码

UITextField 子类弄乱了adjustFontSizeToWidth

RecyclerView 在滚动时弄乱了子视图

更漂亮的东西弄乱了 jsx 片段