Configurer les cibles et les tâches

Les tâches MSBuild sélectionnées peuvent être définies pour s’exécuter dans l’environnement qu’elles ciblent, lorsque l’ordinateur de développement prend en charge l’environnement cible. Par exemple, quand vous utilisez un ordinateur Windows 64 bits pour générer une application ciblant une architecture Windows 32 bits, les tâches sélectionnées sont exécutées dans un processus 32 bits.

Notes

Si une tâche de génération est écrite dans un langage .NET, comme Visual C# ou Visual Basic, et qu’elle n’utilise pas des ressources natives ou des outils natifs, elle est exécutée dans un contexte cible sans adaptation.

Attributs UsingTask et paramètres de tâche

Les attributs UsingTask suivants affectent toutes les opérations d’une tâche dans un processus de génération spécifique :

  • L’attribut Runtime, s’il est présent, définit la version du common language runtime (CLR) et peut prendre une des valeurs suivantes : CLR2, CLR4, CurrentRuntime ou * (n’importe quel runtime).

  • L’attribut Architecture, s’il est présent, définit la plateforme et le nombre de bits, et peut prendre une des valeurs suivantes : x86, x64, CurrentArchitecture ou * (n’importe quelle architecture).

  • L’attribut TaskFactory, s’il est présent, définit la fabrique de tâches qui crée et exécute l’instance de tâche, et il prend uniquement la valeur TaskHostFactory. Pour plus d’informations, consultez la section Fabriques de tâches plus loin dans ce document.

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

Vous pouvez également utiliser les paramètres MSBuildRuntime et MSBuildArchitecture pour définir le contexte cible d’une invocation de tâche individuelle.

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

Avant que MSBuild exécute une tâche, il recherche un attribut UsingTask qui a le même contexte cible. Les paramètres spécifiés dans l’attribut UsingTask mais qui ne sont pas dans la tâche correspondante sont considérés comme étant en correspondance. Les paramètres spécifiés dans la tâche mais qui ne sont pas dans l’attribut UsingTask correspondant sont également considérés comme étant en correspondance. Si des valeurs de paramètre ne sont pas spécifiées dans l’attribut UsingTask ou dans la tâche, leur valeur par défaut est * (n’importe quel paramètre).

Avertissement

S’il existe plus d’un UsingTask et que tous ont des attributs TaskName, Runtime et Architecture correspondants, le premier à être évalué remplace les autres. Cela diffère du comportement des éléments Property et Target.

Si des paramètres sont définis sur la tâche, MSBuild tente de trouver un attribut UsingTask qui correspond à ces paramètres ou qui au moins n’est pas en conflit avec ceux-ci. Plusieurs attributs UsingTask peuvent spécifier le contexte cible de la même tâche. Par exemple, une tâche qui a des exécutables différents pour des environnements cibles différents peut se présenter comme ceci :

<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>

Remplacement de la valeur par défaut UsingTasks

Par défaut, MSBuild gère UsingTask comme « le premier gagne ». À partir de la version 17.2, MSBuild prend en charge le remplacement de ce comportement via le paramètre Override. Un UsingTask avec le paramètre Override défini sur true prendra la priorité sur n’importe quel autre UsingTask du même TaskName.

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

Avertissement

Cette opération ne peut être effectuée qu’une seule fois par tâche. Les builds qui tentent d’ajouter plusieurs remplacements pour la même tâche recevront l’erreur MSBuild MSB4275.

Fabriques de tâches

Le tableau suivant montre les fabriques de tâches fournies par l’installation de MSBuild :

Fabrique de tâches Description
AssemblyTaskFactory Il s’agit de la valeur par défaut. Exécute la tâche in-process.
TaskHostFactory Exécute la tâche hors processus.
RoslynCodeTaskFactory Pour les tâches inline écrites en C# ou Visual Basic et ciblant .NET Standard ; fonctionne à la fois avec msbuild.exe et dotnet build.
CodeTaskFactory Pour les tâches inline écrites en C# ou Visual Basic et ciblant .NET Framework ; fonctionne uniquement avec msbuild.exe.

Le mécanisme de fabrique de tâches est extensible. Vous pouvez donc également utiliser celles créées par des tiers ou créer les vôtres. Vous pourriez par exemple vouloir en créer une pour prendre en charge un autre langage pour l’écriture de tâches inline.

TaskHostFactory

Avant d’exécuter une tâche, MSBuild vérifie si elle est désignée pour s’exécuter dans le contexte logiciel actif. Si la tâche est bien désignée pour cela, MSBuild la passe à AssemblyTaskFactory, qui s’exécute dans le processus actif ; dans le cas contraire, MSBuild passe la tâche à TaskHostFactory, qui exécute la tâche dans un processus qui correspond au contexte cible. Même si le contexte actif et le contexte cible correspondent, vous pouvez forcer une tâche à s’exécuter hors processus (pour l’isolation, la sécurité ou pour d’autres raisons) en définissant TaskFactory sur TaskHostFactory.

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

Quand TaskHostFactory est spécifié explicitement, le processus qui exécute la tâche est de courte durée. Cela permet au système d’exploitation de nettoyer toutes les ressources liées à la tâche immédiatement après son exécution. Pour cette raison, spécifiez TaskHostFactory lors du référencement des tâches générées dans le même processus de build que leur utilisation, afin d’éviter les erreurs de fichier en cours d’utilisation lors de la mise à jour de l’assembly de tâches après une build.

RoslynCodeTaskFactory

RoslynCodeTaskFactory fournit un mécanisme par lequel vous pouvez écrire du code C# ou Visual Basic pour une tâche dans un fichier projet pour une utilisation immédiate. Le code est compilé lors du processus de génération pour produire une tâche que vous pouvez exécuter dans cette même version. Le code que vous écrivez cible .NET Standard, afin qu’il puisse être utilisé lors de l’exécution de dotnet build, qui utilise la version .NET Core (et .NET 5 et versions ultérieures) de MSBuild, ainsi que msbuild.exe, qui utilise .NET Framework. RoslynCodeTaskFactory est préférable pour les personnalisations qui sont un peu trop difficiles à faire en logique MSBuild, mais pas assez pour justifier la création d’un projet distinct. Consultez Créer une tâche inlined MSBuild avec RoslynCodeTaskFactory.

CodeTaskFactory

CodeTaskFactory est une version antérieure de RoslynCodeTaskFactory, limitée à la version .NET Framework de MSBuild. Consultez Tâches inline MSBuild. Cette fabrique de tâches est prise en charge, mais le code plus récent doit utiliser RoslynCodeTaskFactory pour une applicabilité plus large.

Paramètres de tâche fantôme

Comme tous les autres paramètres de tâche, MSBuildRuntime et MSBuildArchitecture peuvent être définis à partir de propriétés de génération.

<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>

Contrairement à d’autres paramètres de tâche, MSBuildRuntime et MSBuildArchitecture ne sont pas visibles pour la tâche elle-même. Pour écrire une tâche qui tient compte du contexte dans lequel elle s’exécute, vous devez tester le contexte en appelant le .NET Framework ou utiliser les propriétés de la build pour passer les informations de contexte avec d’autres paramètres de la tâche.

Notes

Les attributs UsingTask peuvent être définis à partir des propriétés d’ensemble d’outils et d’environnement.

Les paramètres MSBuildRuntime et MSBuildArchitecture représentent le moyen le plus simple de définir le contexte cible, mais également le plus limité en portée. D’une part, comme ils sont définis sur l’instance de tâche et ne sont pas évalués tant que la tâche n’est pas sur le point d’être exécutée, ils peuvent dériver leur valeur à partir de la portée complète des propriétés disponibles au moment de l’évaluation et au moment de la génération. D’autre part, ces paramètres s’appliquent uniquement à une instance particulière d’une tâche dans une cible particulière.

Notes

Les paramètres de tâche sont évalués dans le contexte du nœud parent et non dans le contexte de l’hôte de tâche. Les variables d’environnement qui dépendent du runtime ou de l’architecture (par exemple, l’emplacement des fichiers programme) correspondent à la valeur associée au nœud parent. Toutefois, si la même variable d’environnement est lue directement par la tâche, elle est correctement évaluée dans le contexte de l’hôte de tâche.