ターゲットとタスクを構成する
開発用コンピューターでターゲット環境がサポートされている場合は、選択した MSBuild タスクを対象の環境で実行するように設定できます。 たとえば、64 ビット Windows コンピューターを使用し、32 ビット Windows アーキテクチャをターゲットとするアプリケーションを構築するとき、一部のタスクが 32 ビット プロセスで実行されます。
注意
ビルド タスクが Visual C# や Visual Basic のような .NET 言語で記述されており、ネイティブのリソースまたはツールを使用しない場合、調整なしで、あらゆるターゲット コンテンツで実行されます。
UsingTask 属性とタスク パラメーター
次の UsingTask
属性は、特定のビルド プロセスで、あるタスクのすべての操作に影響を与えます。
Runtime
属性は、それが存在する場合、共通言語ランタイム (CLR) バージョンを設定し、値としてCLR2
、CLR4
、CurrentRuntime
、*
(任意のランタイム) のいずれかを取得します。Architecture
属性は、それが存在する場合、プラットフォームとビット数を設定し、値としてx86
、x64
、CurrentArchitecture
、*
(任意のアーキテクチャ) のいずれかを取得します。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
が存在し、すべてに一致する TaskName
、Runtime
、Architecture
属性がある場合、最初に評価されたものが他に取って代わります。 これは、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
パラメーターを使用してこの動作をオーバーライドできます。 パラメーター Override
が true
に設定されている 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.exe と dotnet build の両方で動作します。 |
CodeTaskFactory |
C# または Visual Basic で記述され、.NET Framework をターゲットにするインライン タスクの場合、msbuild.exe でのみ動作します。 |
タスク ファクトリ メカニズムは拡張可能であるため、サード パーティによって作成されたものを使用したり、独自に作成したりすることもできます。 タスク ファクトリを作成する理由は、インライン タスクを記述するための別の言語をサポートするためです。
TaskHostFactory
MSBuild はタスクを実行する前に、現在のソフトウェア コンテキストで実行するように指定されているかどうかを確認します。 タスクがそのように指定されている場合は、MSBuild により、現在のプロセスで実行する AssemblyTaskFactory
に渡されます。それ以外の場合、MSBuild により、ターゲット コンテキストに一致するプロセスでタスクを実行する TaskHostFactory
にタスクが渡されます。 現在のコンテキストとターゲット コンテキストが一致する場合でも、TaskFactory
を TaskHostFactory
に設定することで、プロセスの外でタスクを実行するように強制できます (隔離、セキュリティ、またはその他の理由から)。
<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
を使用する必要があります。
ファントム タスク パラメーター
他のタスク パラメーターと同様に、MSBuildRuntime
と MSBuildArchitecture
はビルド プロパティから設定できます。
<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>
他のタスク パラメーターとは異なり、MSBuildRuntime
と MSBuildArchitecture
はタスク自体に対しては明白ではありません。 実行しているコンテキストを認識するタスクを作成するには、.NET Framework を呼び出してコンテキストをテストするか、またはビルド プロパティを使って他のタスク パラメーターからコンテキスト情報を渡す必要があります。
Note
UsingTask
属性は、ツールセットと環境のプロパティから設定できます。
MSBuildRuntime
および MSBuildArchitecture
パラメーターは、ターゲット コンテキストを設定する最も柔軟な方法を提供しますが、範囲も最も制限されています。 柔軟性の点では、これらはタスク インスタンス自体で設定され、タスクの実行直前まで評価されないため、評価時とビルド時の両方で使用できるプロパティの完全なスコープからその値を派生できます。 制限については、これらのパラメーターは、特定のターゲットのタスクの特定のインスタンスにのみ適用されます。
Note
タスク パラメーターは、タスク ホストのコンテキストではなく、親ノードのコンテキストで評価されます。 ランタイムまたはアーキテクチャに依存する環境変数は (Program Files の場所など)、親ノードに一致する値に評価されます。 一方、同じ環境変数がタスクによって直接読み取られた場合は、タスク ホストのコンテキストで正しく評価されます。