.NET 3.5的代码合约破坏了VS10的调试器

7
我最近使用代码合同(code contracts)替代了很多手动先决条件测试和异常抛出。我使用了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] 很棒的用户名 :) - roundcrisis
2个回答

1

我希望你知道什么是合同重写——在运行时生成的额外代码,没有任何源代码供编译器依附。由于CLR有许多不同的元素,有很多调试器根本不会做或者会感到困惑,只有那些具有广泛影响的完整语言特性才能获得完整的调试器支持预算。比如lambda表达式。

这并不是说提交错误报告没有好处,只是当你使用甚至还没有完全开发的方面时,不要期望任何事情会变得更好。成为早期采用者总是有这种代价,但也有炫耀权利 :-)


是的,我知道外部工具必须使用 IL 并移动一些东西。自从问了这个问题后,我迁移到了 .NET 4,并再也没有被这个问题困扰过。我猜测 .NET 3.5 的代码合约工具在这方面是不完整的。 - Trillian

0
请记住,代码合约目前不能与后置条件和多线程一起使用。 将合约限制为仅进行前置条件重写。 这解决了我们系统中的许多问题。

实际上在我的情况下,即使重写合同设置为无,仅仅打开合同重写也会导致问题。因此,后置条件不是问题,我也没有进行任何多线程操作。 - Trillian

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