3

私はAfterthought(PostSharpと同様)を使用し、出力アセンブリを変更することにより、ビルド後の変更を一部のコードに適用しています。現在、私のプロジェクトファイルには次のようなものがあります(省略形):

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

基本的には、ビルド後、Amendments.dllにあるコードで出力アセンブリを変更するプロセスを実行するAfterThoughtTaskを使用します。これは私が期待するとおりに正常に機能し、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 でビルドし、どのプロジェクトの dll が 117kb サイズに一致するかを確認します。

于 2012-10-07T19:27:14.730 に答える