构建完成后,MSBuild从IntermediateOutputPath复制

时间:2012-10-05 14:02:44

标签: .net visual-studio msbuild msbuild-task afterthought

我正在使用Afterthought(类似于PostSharp)通过修改输出程序集将后期构建更改应用于某些代码。目前,我的项目文件在(缩写):

中有类似的内容
<Target Name="AfterBuild">
  <AfterThoughtTask TargetAssembly="$(TargetPath)" AmendWith="$(TargetDir)Amendments.dll" />
</Target>

基本上它是说:在构建之后,使用AfterThoughtTask运行一个进程来修改输出程序集,其中包含Amendments.dll中的代码。这正如我所期望的那样正常,并且使用附加代码修改了MyProject\bin\Debug\MyProject.dll的MyProject.dll输出。

然后我对项目文件稍作修改:

<PropertyGroup>
  <OutputPath>SomeOtherProjectLocation\bin\</OutputPath>
</PropertyGroup>

所以我所做的就是改变输出路径。现在我调试AfterThoughtTask,并在所有代码执行完毕后点击断点。当我在这个断点处停止时,文件SomeOtherProjectLocation\bin\MyProject.dll(我打算修改的文件,位于我希望它所在的文件夹中)似乎被修改(文件大小为117kb vs 103kb当未修改时)。看起来好像现在情况正常。然后我释放断点,突然文件大小下降到103kb,不知何故被原始的未修改文件替换。查看诊断构建报告,AfterThoughtTask是最后一个没有报告文件副本的任务。

在同一个断点再次运行,我看到位于IntermediateOutputPath目录(obj \ Debug)的文件仍然是103kb(未修改),所以我试着看看是否是覆盖了该文件的文件修正了一个。当我在断点处(任务执行结束,但在将控制权返回给构建之前)时,我将IntermediateOutputPath目录中的文件重命名为MyProject.dll_hidden。我没有错误,但我的文件不再被写下来。

所以我只能假设文件是​​从IntermediateOutputPath目录复制到目标文件上的,但是构建日志似乎没有表明这一点,我不明白为什么要更改{{ 1}}会以这种方式实现它与之前使用默认OutputPath的行为方式。有人在这里有任何指导吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

使用命令行构建它并将详细程度设置为diag(/ v:diag)。将输出管道输出到日志文件并将其删除 - 通常使用diag输出,您可以轻松找到问题的来源(或在此处发布日志)。

同时检查以下内容 - 如果更改全局OutputPath - 其他构建项目将写入该文件夹 - 使用未更改的OutputPath构建并查找哪个项目的dll与117kb大小匹配。