我正在使用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
的行为方式。有人在这里有任何指导吗?提前谢谢。
答案 0 :(得分:0)
使用命令行构建它并将详细程度设置为diag(/ v:diag)。将输出管道输出到日志文件并将其删除 - 通常使用diag输出,您可以轻松找到问题的来源(或在此处发布日志)。
同时检查以下内容 - 如果更改全局OutputPath - 其他构建项目将写入该文件夹 - 使用未更改的OutputPath构建并查找哪个项目的dll与117kb大小匹配。