4

Windows 2008 x64 で MSBuild (フレームワーク バージョン v4.0.30319 - 32 ビット 1) を使用しています。MSBuild がインライン タスクを管理する方法を理解したい。タスクへの呼び出しごとに 1 回コンパイルされますか? または、一度コンパイルして、タスクへの呼び出しごとに再利用しますか?

"/m" 引数を指定して MSBuild を実行し、C# コードに意図的なエラーを導入しようとしました。そして、MSBuild は 1 つのテキスト ファイル (プロファイル フォルダーのどこかにある一時フォルダーの下) を示しました。他のテキスト ファイルは生成されませんでした。ただし、エラーがなければこれを把握する方法がわかりませんでした。

これを理解しようとする背後にある私の意図:これが(インラインタスクの代わりに)コンパイルされたdllを使用するのと同じ順序で効率的かどうかを知ること。コンパイルが 1 回だけ行われる場合、インライン タスク コードのコンパイルのわずかなオーバーヘッドは許容されます (コードとバイナリの SCM の側面を節約できるため)。

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="default" ToolsVersion="4.0">
  <Target Name="default">
    <ItemGroup>
      <A Include="1;2;3;4;5;6;7;8;9;10"/>
    </ItemGroup>
    <MSBuild Projects="$(MSBuildProjectFullPath)"
             BuildInParallel="true"
             Targets="Echoer"
             ToolsVersion="4.0"
             StopOnFirstFailure="true"
             Properties="Prop=%(A.Identity)"/>
  </Target>
  <Target Name="Echoer">
    <MyTask WhatToEcho="$(Prop)"/>
  </Target>
  <UsingTask TaskName="MyTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
      <WhatToEcho ParameterType="System.String" Required="True"/>
    </ParameterGroup>
    <Task>
      <Code Language="cs" Type="Fragment">
        <![CDATA[
        Log.LogMessage("Property received: "+WhatToEcho);
        ]]>
      </Code>
    </Task>
  </UsingTask>
</Project>
4

1 に答える 1

3

MSBuild 4.5 を搭載した私のマシン のProcMonで例を実行すると、次のことがわかります。

  1. 一時的なアセンブリは、MSBuild によってユーザー %TEMP% フォルダーの下のビルドごとに 1 回生成されます。(実際にアセンブリを作成したのは csc.exe でしたが、これはコード生成方法の副作用にすぎないと思います)。
  2. ソース コードは一時的な .cs ファイルにあり、これも %TEMP% の下にありました。
  3. ビルドが終了すると、すべてのファイル (ソース ファイルと出力アセンブリ) が削除されます。

つまり、ビルド中のタスクへの最初の呼び出しでパフォーマンス ヒットが表示されます。タスクに対する後続のすべての呼び出しでは、キャッシュされたアセンブリが使用されます。ビルド後にキャッシュが失われると、アセンブリを再度作成する必要があります。つまり、高速インクリメンタル ビルドを行っている場合は、コンパイル済みの DLL が役立つ可能性があります。

于 2013-08-12T01:54:20.580 に答える