我正在使用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
。有人在这里有任何指导吗?提前致谢。