我刚刚开始使用代码契约来使我的前提条件更整洁,更具可读性,希望能够获得更多好处,比如稍后进行静态检查。但是,当我提交我的代码并完成构建时,它在单元测试(测试我使用CC的代码)上失败了,错误:
...抛出异常: System.Diagnostics.Contracts.ContractException:必须使用代码契约二进制重写器(CCRewrite)重写一个程序集(可能是" ..."),因为它正在调用Contract.Requires并且定义了CONTRACTS_FULL符号。从项目中删除CONTRACTS_FULL符号的任何显式定义并重建。 CCRewrite可以从http://go.microsoft.com/fwlink/?LinkID=169180下载。安装重写器后,可以从“代码约定”窗格中项目的“属性”页面在Visual Studio中启用它。确保"执行运行时合同检查"已启用,将定义CONTRACTS_FULL。
它是TFS 2010 Build Server,它没有为Code Contracts安装任何额外的东西。我在本地安装了CC msi,没有任何问题。我的项目CC属性页面设置如下:
我用google搜索,似乎有很多人抱怨TFS没有CC的支持。我目前没有构建框的管理员权限,但我试图在那里尝试安装相同的msi。有谁知道这个问题的解决方案是什么?
答案 0 :(得分:2)
我使用Reflector来查看Contract.Requires
的定义,我认为当您的代码使用没有应用属性Conditional("CONTRACTS_FULL")
的方法的重载时会出现问题。这意味着代码是在您的TFS服务器上编译的,该服务器没有安装代码契约,并且您得到了您提到的错误。
我尝试更改代码以使用其中一个已应用Conditional("CONTRACTS_FULL")
属性的重载。
[Conditional("CONTRACTS_FULL"), ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), __DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static void Requires(bool condition);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), __DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static void Requires<TException>(bool condition) where TException: Exception;
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), Conditional("CONTRACTS_FULL"), __DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static void Requires(bool condition, string userMessage);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), __DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static void Requires<TException>(bool condition, string userMessage) where TException: Exception;
答案 1 :(得分:0)
请参阅Code Contracts manual。它肯定会告诉您有关使用代码约定与单元测试和自动CI构建的所有信息。
具体来说,请阅读第7.8节:测试线束设置。另请参阅第6.2节:运行时合同检查。它告诉您在检查合同时的各种要求,并建议具有专门用于执行合同检查的构建类型(您可能不希望将其作为CI构建的一部分执行 - 您可能会,但是再次,您可能不会;请阅读此内容部分)。例如,除了标准的Debug和Release版本之外,他们还建议你可能想要一个执行合同检查的 Checked 版本。您可能还想查看第5部分:使用指南的所有内容,因为在理解第6部分:Visual Studio集成中所有内容之前,需要了解这些信息的大部分内容。 ,其中大部分信息适用于构建服务器(因为它们构建了代码)。
此外,根据您发布的错误和屏幕截图,您似乎正在使用标准合同要求选项。如果是这样,那么在构建代码时,您需要使用二进制重写器ccrewrite
。因此,您的构建服务器需要安装代码合同。您可以在章节6.1装配模式中了解更多相关信息。