我从Visual Studio 2010中获得了Code Contracts,但我无法ccrewrite.exe从命令行做任何有用的事情.这是一个示例应用程序:
using System.Diagnostics.Contracts;
public class Dummy
{
public static void Main(string[] args)
{
Contract.Requires(args.Length > 0);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我编译代码并在其上运行ccrewrite.exe:
> csc /debug+ /D:CONTRACTS_FULL Dummy.cs
> ccrewrite /o:RewrittenDummy.exe Dummy.exe
elapsed time: 61ms
Run Code Online (Sandbox Code Playgroud)
RewrittenDummy.exe之后没有文件.
我已经尝试了很多选项,但没有任何区别.我注意到的一些事情:
我已经尝试过警告和冗长,这根本没有帮助我做错了什么?
我的解决方案/项目构建良好,关闭此特定项目的代码合同.
当我打开我的项目执行运行时合同检查时,构建失败.CC重写者开始按照以下方式提出数百条消息:
Could not resolve member reference: ....
看来这个问题是由通过libpaths参数传递给ccrewrite的项目引用的顺序引起的.当我拆开构建并在命令行上运行它时,我按照特定顺序手动指定引用到libpaths,ccrewrite工作,构建完成.
例如
ccrewrite /level:4 /rewrite "/assemblyMode=standard" /throwonfailure /libpaths:"X Y Z" "target.dll" -- fails :(
ccrewrite /level:4 /rewrite "/assemblyMode=standard" /throwonfailure /libpaths:"Z Y X" "target.dll" -- compiles/rewrites :)
这对我来说有点奇怪,我以为ccrewrite应该能够处理任意顺序,特别是因为提供的'破坏'排序是msbuild传递给Microsoft.CodeContracts.targets文件/ ccrewrite,但是这对CC人来说是一个问题.我也在3台不同的机器上进行了测试,结果相同,所以它要么是ccrewrite问题,要么是ccrewrite不喜欢的特定csproj的奇怪之处.
我想知道的是,我可以确保我的参考项目的特定顺序,它们被链接传递到CC目标文件吗?我原以为构建引擎会在ItemGroup//ProjectReference元素下使用它在项目csproj文件中读取的顺序,但事实并非如此.
有任何想法吗?