MSBuild在构建完成后从IntermediateOutputPath复制

3

我正在使用Afterthought(类似于PostSharp)来对一些代码应用后期构建更改,通过修改输出程序集。目前,我的项目文件中有如下内容(缩写):

<Target Name="AfterBuild">
  <AfterThoughtTask TargetAssembly="$(TargetPath)" AmendWith="$(TargetDir)Amendments.dll" />
</Target>

基本上它的意思是:构建后,使用AfterThoughtTask运行进程,使用Amendments.dll中的代码修改输出程序集。这很好地达到了我的预期,MyProject.dll输出到MyProject\bin\Debug\MyProject.dll被额外的代码修正了。
然后我对我的项目文件进行了轻微的更改:
<PropertyGroup>
  <OutputPath>SomeOtherProjectLocation\bin\</OutputPath>
</PropertyGroup>

所做的全部工作只是更改输出路径。现在我调试AfterThoughtTask,并在所有代码执行后打了一个断点。当我停在这个断点时,文件SomeOtherProjectLocation\bin\MyProject.dll(这是我想修改的文件,位于我期望它存在的文件夹中)似乎已被修改(文件大小为117kb,而未修改时为103kb)。此时似乎一切都很顺利。然后我释放断点,突然文件大小又降回到103kb,以某种方式被原始未修改的文件替换了。查看诊断生成报告,在没有报告文件复制之后,AfterThoughtTask是最后运行的任务。

再次在同一断点运行,我发现位于IntermediateOutputPath目录(obj\Debug)中的文件仍然是103kb(未修改),所以我尝试查看是否覆盖了修改后的文件。当我到达断点时(任务执行结束,但在控件返回生成之前),我将IntermediateOutputPath目录中的文件重命名为MyProject.dll_hidden。我没有收到任何错误消息,但我的文件不再被覆盖。

所以我只能假设该文件是从IntermediateOutputPath目录复制到目标文件中的,但生成日志似乎并没有表明这一点,而我也不明白为什么更改OutputPath会使它以这种方式发生,而不是在默认的OutputPath下运行。有没有人能在这里提供指导?先感谢您。

1个回答

0

使用命令行构建,并将详细程度设置为 diag (/v:diag)。将输出导入日志文件并进行分析 - 通常使用 diag 输出,您可以轻松定位问题的源头(或在此处发布日志)。

还要检查以下内容 - 如果更改全局 OutputPath,则其他构建项目将写入该文件夹 - 使用未更改的 OutputPath 进行构建,并找到与 117kb 大小匹配的项目 dll。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接