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

4

1 回答 1

0

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

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

于 2012-10-07T19:27:14.730 回答