0

次のことを行うビルドプロセスがあります。

  1. COM DLL (TaskItem の名前付きグループ) の数 (たとえば 10) に対して TLBIMP を実行します。これは、Exec タスクを使用する「インポート」ターゲットです。
  2. 10 個の相互運用アセンブリで ILDASM を実行します。これは、Exec タスクを使用する「逆アセンブル」ターゲットです。
  3. カスタム タスクを実行して、10 個の IL ファイルすべてを同時に取得し、それらに対していくつかの作業を行います (詳細は重要ではありませんが、このタスクで 10 個の IL ファイルすべてを一緒に処理することが重要です)。これが私の「仕事」の目標です。
  4. ILASM を使用して 10 個の IL ファイルを再アセンブルし、10 個の DLL に戻します。これは私の「アセンブル」ターゲットで、Exec タスクを使用します。
  5. ILMerge を実行して、10 個のアセンブリを 1 つにマージします。これは私の「マージ」ターゲットで、Exec タスクを使用します。

クリーンな再構築を行うと、すべてがうまくいきます。インクリメンタル ビルドを実行し、元の COM DLL のほんの一部が変更された場合、MSBuild は適切なターゲットの部分ビルドのみを正確に実行します。出力は、実際には入力に対して古くなっています。

古いものだけでなく、すべての入力を渡すタスクを実行するために、1 つのターゲット (上記の手順 3) に対してのみ MSBuild を "強制" する方法はありますか? カスタム タスクのコードを変更してファイル名をハードコーディングしたくありません。MSBuild スクリプトから TaskItems として提供したいのですが、カスタム タスクには、この特定のビルドで再構築されたものだけでなく、COM DLL の元の TaskItem グループ。

4

2 に答える 2

0

You seem to be on the right track with touching the files before your target is executed. Since the input files have been modified (by your touch) more recently then all the outputs the target is completly rebuilt. Another approach you can do is to create a target, i.e. CleanIntFiles, which would delete those files. Then you can place that target onto the BeforeBuildDependsOn property.

For more info about how to extend that property take a look at my article Inside MSBuild.

Sayed Ibrahim Hashimi

My Book: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

于 2009-05-22T04:09:18.613 に答える
0

私は方法を見つけたと思います。次のようにグループを定義できます。

  <ItemGroup>
    <PrelimIL Include="$(IntermediateOutputPath)intermediate\*.il"/>
  </ItemGroup>

そして、私の「逆アセンブル」ターゲットには、2 番目のタスクがあります。

<Touch Files="@(PrelimIL)" />
于 2009-05-21T20:26:17.903 に答える