ターゲットとタスクを構成する

開発用コンピューターでターゲット環境がサポートされている場合は、選択した MSBuild タスクを対象の環境で実行するように設定できます。 たとえば、64 ビット Windows コンピューターを使用し、32 ビット Windows アーキテクチャをターゲットとするアプリケーションを構築するとき、一部のタスクが 32 ビット プロセスで実行されます。

注意

ビルド タスクが Visual C# や Visual Basic のような .NET 言語で記述されており、ネイティブのリソースまたはツールを使用しない場合、調整なしで、あらゆるターゲット コンテンツで実行されます。

UsingTask 属性とタスク パラメーター

次の UsingTask 属性は、特定のビルド プロセスで、あるタスクのすべての操作に影響を与えます。

  • Runtime 属性は、それが存在する場合、共通言語ランタイム (CLR) バージョンを設定し、値として CLR2CLR4CurrentRuntime* (任意のランタイム) のいずれかを取得します。

  • Architecture 属性は、それが存在する場合、プラットフォームとビット数を設定し、値として x86x64CurrentArchitecture* (任意のアーキテクチャ) のいずれかを取得します。

  • TaskFactory 属性は、それが存在する場合、タスク インスタンスを作成して実行するタスク ファクトリを設定し、値として TaskHostFactory のみを取得します。 詳細については、このドキュメントで後述する「タスク ファクトリ」を参照してください。

<UsingTask TaskName="SimpleTask"
    Runtime="CLR2"
    Architecture="x86"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v3.5.dll" />

MSBuildRuntime パラメーターと MSBuildArchitecture パラメーターを利用して、個々のタスク呼び出しのターゲット コンテキストを設定することもできます。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="MyTarget">
        <SimpleTask MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

MSBuild はタスクを実行する前に、一致する (ターゲット コンテキストが同じ) UsingTask を探します。 UsingTask で指定されているが、該当するタスクにないパラメーターは一致すると見なされます。 タスクで指定されているが、該当する UsingTask にないパラメーターも一致すると見なされます。 パラメーター値が UsingTask にもタスクにも指定されていない場合、値は既定として * (任意のパラメーター) になります。

警告

複数の UsingTask が存在し、すべてに一致する TaskNameRuntimeArchitecture 属性がある場合、最初に評価されたものが他に取って代わります。 これは、Property および Target とは異なる動作です。

パラメーターがタスクに設定されていると、MSBuild は、それらのパラメーターに一致するか、少なくともそれらと競合しない UsingTask を探します。 複数の UsingTask が同じタスクのターゲット コンテキストを指定できます。 たとえば、異なるターゲット環境のために異なる実行可能ファイルが与えられているタスクは次のようになります。

<UsingTask TaskName="MyTool"
    Runtime="CLR2"
    Architecture="x86"
    AssemblyFile="$(MyToolsPath)\MyTool.v2.0.dll" />

<UsingTask TaskName="MyTool"
    Runtime="CLR4"
    Architecture="x86"
    AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="MyTarget">
        <MyTool MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

既定の UsingTasks のオーバーライド

既定では、MSBuild は UsingTask を "最初のものが優先" として処理します。17.2 以降、MSBuild では、Override パラメーターを使用してこの動作をオーバーライドできます。 パラメーター Overridetrue に設定されている UsingTask は、同じ TaskName の他の UsingTask よりも優先されます。

<UsingTask TaskName="MyTool"
    Runtime="CLR4"
    Architecture="x86"
    Override="true"
    AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />

警告

これは、タスクごとに 1 回だけ実行できます。 同じタスクに対して複数のオーバーライドを追加しようとするビルドでは、MSBuild エラー MSB4275 が発生します。

タスク ファクトリ

次の表は、MSBuild インストールによって提供されるタスク ファクトリを示しています。

タスク ファクトリ 説明
AssemblyTaskFactory これが既定値です。 インプロセスでタスクを実行します。
TaskHostFactory アウトプロセスでタスクを実行します。
RoslynCodeTaskFactory C# または Visual Basic で記述され、.NET Standard をターゲットにするインライン タスクの場合、msbuild.exedotnet build の両方で動作します。
CodeTaskFactory C# または Visual Basic で記述され、.NET Framework をターゲットにするインライン タスクの場合、msbuild.exe でのみ動作します。

タスク ファクトリ メカニズムは拡張可能であるため、サード パーティによって作成されたものを使用したり、独自に作成したりすることもできます。 タスク ファクトリを作成する理由は、インライン タスクを記述するための別の言語をサポートするためです。

TaskHostFactory

MSBuild はタスクを実行する前に、現在のソフトウェア コンテキストで実行するように指定されているかどうかを確認します。 タスクがそのように指定されている場合は、MSBuild により、現在のプロセスで実行する AssemblyTaskFactory に渡されます。それ以外の場合、MSBuild により、ターゲット コンテキストに一致するプロセスでタスクを実行する TaskHostFactory にタスクが渡されます。 現在のコンテキストとターゲット コンテキストが一致する場合でも、TaskFactoryTaskHostFactory に設定することで、プロセスの外でタスクを実行するように強制できます (隔離、セキュリティ、またはその他の理由から)。

<UsingTask TaskName="MisbehavingTask"
    TaskFactory="TaskHostFactory"
    AssemblyFile="$(MSBuildToolsPath)\MyTasks.dll">
</UsingTask>

TaskHostFactory が明示的に指定されている場合、タスクを実行するプロセスの有効期間が短くなります。 これにより、オペレーティング システムは、タスクの実行直後にタスクに関連するすべてのリソースをクリーンアップできます。 このため、ビルド後にタスク アセンブリを更新するときにファイル使用中エラーが発生しないよう、使用時に同じビルド プロセスに組み込まれているタスクを参照するときは、TaskHostFactory を指定してください。

RoslynCodeTaskFactory

RoslynCodeTaskFactory は、プロジェクト ファイル内のタスクの C# または Visual Basic コードを記述して、すぐに使用できるメカニズムを提供します。 コードはビルド プロセス中にコンパイルされ、同じビルドで実行できるタスクが生成されます。 記述するコードは .NET Standard をターゲットにしているため、.NET Core (および .NET 5 以降) バージョンの MSBuild を使用する dotnet build と、.NET Framework を使用する msbuild.exe の実行時に使用できます。 RoslynCodeTaskFactory は、MSBuild ロジックでは少し難しすぎるが、別のプロジェクトを作成するのに十分な複雑さではないカスタマイズに最適です。 「RoslynCodeTaskFactory を使って MSBuild インライン タスクを作成する」を参照してください。

CodeTaskFactory

CodeTaskFactory は、MSBuild の .NET Framework バージョンに制限されている RoslynCodeTaskFactory の古いバージョンです。 「MSBuild インライン タスク」を参照してください。 このタスク ファクトリはサポートされていますが、より広い適用性を実現するために、新しいコードでは RoslynCodeTaskFactory を使用する必要があります。

ファントム タスク パラメーター

他のタスク パラメーターと同様に、MSBuildRuntimeMSBuildArchitecture はビルド プロパティから設定できます。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <FrameworkVersion>3.0</FrameworkVersion>
    </PropertyGroup>
    <Target Name="MyTarget">
        <SimpleTask MSBuildRuntime="$(FrameworkVerion)" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

他のタスク パラメーターとは異なり、MSBuildRuntimeMSBuildArchitecture はタスク自体に対しては明白ではありません。 実行しているコンテキストを認識するタスクを作成するには、.NET Framework を呼び出してコンテキストをテストするか、またはビルド プロパティを使って他のタスク パラメーターからコンテキスト情報を渡す必要があります。

Note

UsingTask 属性は、ツールセットと環境のプロパティから設定できます。

MSBuildRuntime および MSBuildArchitecture パラメーターは、ターゲット コンテキストを設定する最も柔軟な方法を提供しますが、範囲も最も制限されています。 柔軟性の点では、これらはタスク インスタンス自体で設定され、タスクの実行直前まで評価されないため、評価時とビルド時の両方で使用できるプロパティの完全なスコープからその値を派生できます。 制限については、これらのパラメーターは、特定のターゲットのタスクの特定のインスタンスにのみ適用されます。

Note

タスク パラメーターは、タスク ホストのコンテキストではなく、親ノードのコンテキストで評価されます。 ランタイムまたはアーキテクチャに依存する環境変数は (Program Files の場所など)、親ノードに一致する値に評価されます。 一方、同じ環境変数がタスクによって直接読み取られた場合は、タスク ホストのコンテキストで正しく評価されます。