我正在使用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
下运行。有没有人能在这里提供指导?先感谢您。