我已经开始在我正在编写的所有新代码中使用代码契约,例如在我正在构建的框架库中,以帮助在 ASP.NET MVC 应用程序中引导IoC、O/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 文件如何进行正确的代码合同重写?