我有一个使用代码契约的C#PCL项目。但是,在TeamCity上,该项目无法构建,但看起来在本地构建成功。但是,构建日志确实声称构建确实失败,但是根本没有给出任何理由。

“警告失败构建”被禁用。

我收到一个奇怪的警告:


  CodeContracts:找不到方法/类型
  程序集'[项目中的'System.Diagnostics.Contracts.PureAttribute'
  路径] \ packages \ Microsoft.Net.Http.2.2.29 \ lib \ portable-net40 + sl4 + win8 + wp71 + wpa81 \ System.Net.Http.dll'


搜索谷歌给我one relevant result与遇到相同问题的人。
但是,除了碰撞,它没有其他反应。

Build log

我也觉得这行很奇怪:


  C:\ Windows \ system32 ******。dll(1,1):消息:CodeContracts:已检查3154
  断言:2821正确(已屏蔽333)


为什么二进制文件位于system32中?我认为MSBuild甚至都没有对该文件夹的写权限...

最佳答案

问题似乎是它默认情况下会在Microsoft.Contracts(per spec)中查找合同类型,因为Microsoft.Contracts不是我正在使用的合同类型,所以该类型不起作用。我正在使用mscorlib中的System.Diagnostics.Contracts。它并没有告诉我,而是做了一些荒谬的事情。我开始浏览源代码,并found the offending code,但是我认为该代码的质量很差,因此我放弃了实际查找问题并创建请求请求的权限。

但是,解决方案很简单:您需要覆盖合约库的默认值Microsoft.mscorlib与Contracts进行合约,因此只需将以下内容添加到静态分析器的命令行中即可:

-cclib mscorlib

这至少对我有用。我仍然认为这是由代码合同中的两个错误引起的:


由于出现警告,它使构建失败。
它试图在错误的程序集中找到PureAttribute

10-07 23:54