2012-10-05 46 views
3

我正在使用Afterthought(与PostSharp类似)通过修改输出程序集将后构建更改应用于某些代码。目前,我的项目文件中(略)是这样的:构建完成后MSBuild从IntermediateOutputPath复制

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

基本上它说:编译之后,使用的运行过程中修改与Amendments.dll发现代码的输出组件AfterThoughtTask。这工作得很好,就像我期望的那样,用附加代码修改了输出到MyProject\bin\Debug\MyProject.dll的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相比如何。任何人有任何指导吗?提前致谢。

回答

0

使用命令行进行构建并将详细信息设置为diag(/ v:diag)。将输出输出到日志文件并将其挖下 - 通常使用诊断输出,您可以轻松找到问题的来源(或在此处发布日志)。

还检查以下 - 如果您更改全局OutputPath - 其他生成项目将写入该文件夹 - 建立与未改变的OutputPath并找到什么项目的DLL匹配117kb大小。