3

我已经开始在我正在编写的所有新代码中使用代码契约,例如在我正在构建的框架库中,以帮助在 ASP.NET MVC 应用程序中引导IoCO/RM等。我为这个框架库编写了一个简单的构建脚本,如下所示:

@echo off
echo.
echo Cleaning build output (removing 'obj' and 'bin' folders)...
for /f "tokens=*" %%G in ('dir /b /ad /s bin') do rmdir /s /q "%%G"
for /f "tokens=*" %%G in ('dir /b /ad /s obj') do rmdir /s /q "%%G"
rmdir /s /q build
echo.
echo Starting the build...
call "%VS100COMNTOOLS%\vsvars32.bat"
msbuild Integration.build /target:Build
echo.
echo Done!
pause

这行不通。如果我运行它,我最终在我的build文件夹中得到的是,无论出于何种原因,没有完全重写的程序集,以及ccrewrite在输出目录中乱扔垃圾的文件。.pdb.original.rewritten.csproj.FileListAbsolute.txt

起作用的是首先在 Visual Studio 2010 中构建解决方案,在批处理文件中注释掉第 3 行到第 7 行并再次运行它。然后我得到了正确重写的程序集,没有.pdb.original文件.rewritten

我从中推断的是,Visual Studio 2010 以某种方式正确地触发了代码合同重写器,因此来自 Visual Studio 2010 构建的结果程序集被命令行 MSBuild 调用重新使用,所以我的批处理脚本基本上只是将文件复制到build目录。换句话说,相当没用。

我读过这个,但乔恩的问题似乎与我的不同,因为ccrewrite显然是在做某事,但无论出于何种原因,它都没有完成重写。该Integration.build文件构建了正确的配置(在.csproj文件中启用了代码合同),其他一切看起来都正确,只是无法正常工作。

所以,我想知道:如何以 Visual Studio 2010 的方式运行 MSBuild,ccrewrite并且不会在输出目录中乱扔.rewritten文件.pdb.original?有没有人有一个完美的例子来说明 MSBuild 文件如何进行正确的代码合同重写?

4

2 回答 2

1

答案在剧本中。Visual Studio 要做的就是运行将调用其他任务的 MSBuild 任务。您可以做的一件事是转到工具|选项|构建...并打开日志记录,以便您可以详细查看哪个位正在执行生成工件的操作。

如此复杂且牵涉其中的事情,一个人会怎么做?阅读MSBuild 指南,例如Hashimi p1Part 2

然后挖掘构建源代码,例如:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets

到达那里的最好方法是打开你的 .csproj 并查看它包含的内容并通过它(.CSharp.targets 是第一个 - 我引用的那个在堆栈中更靠后)。

(那并等待有人弹出一个实际的答案!)

于 2010-08-24T08:02:33.833 回答
1

我玩过 Code Contract 的静态分析,它很酷。
现在正在尝试设置 TeamCity 构建...

这是来自 Microsoft Research 的msbuild 集成信息(参见第 44 页)

于 2010-08-27T15:56:26.887 回答