Tutoriel : Utiliser MSBuild
MSBuild est la plateforme de génération pour Microsoft et Visual Studio. Ce tutoriel vous présente les blocs de construction de MSBuild et vous montre comment écrire, manipuler et déboguer des projets MSBuild. Vous apprendrez à propos de :
Création et manipulation d’un fichier projet.
Comment utiliser les propriétés de build.
Comment utiliser des éléments de build.
Vous pouvez exécuter MSBuild à partir de Visual Studio ou à partir de la fenêtre de commande . Dans ce tutoriel, vous allez créer un fichier projet MSBuild à l’aide de Visual Studio. Vous modifiez le fichier projet dans Visual Studio et utilisez la fenêtre de commande pour générer le projet et examiner les résultats.
Installer MSBuild
Si vous avez Visual Studio, alors vous avez déjà MSBuild installé. Avec Visual Studio 2019 et versions ultérieures, il est installé sous le dossier d’installation de Visual Studio. Pour une installation par défaut classique sur Windows 10, MSBuild.exe se trouve sous le dossier d’installation dans MSBuild\Current\Bin.
Dans le programme d’installation, vérifiez que les outils MSBuild pour les charges de travail que vous utilisez sont sélectionnés, puis choisissez Installer.
Pour installer MSBuild sur un système qui n’a pas Visual Studio, accédez à Build Tools pour Visual Studio 2019, ou installez le kit de développement logiciel (SDK) .NET .
Si vous avez Visual Studio, alors vous avez déjà MSBuild d'installé. Avec Visual Studio 2022, il est installé sous le dossier d’installation de Visual Studio. Pour une installation par défaut classique sur Windows 10, MSBuild.exe se trouve sous le dossier d’installation dans MSBuild\Current\Bin.
Dans le programme d’installation de Visual Studio, accédez à Composants Individuels, et recherchez la case à cocher MSBuild. Il est automatiquement sélectionné lorsque vous choisissez l’une des autres charges de travail à installer.
Pour installer MSBuild sur un système qui n’a pas Visual Studio, accédez à Build Tools pour Visual Studio 2022 sur la page de téléchargements . Une autre façon d’obtenir MSBuild consiste à installer le Kit de développement logiciel (SDK) .NET .
Créer un projet MSBuild
Le système de projet Visual Studio est basé sur MSBuild. Il est facile de créer un fichier projet à l’aide de Visual Studio. Dans cette section, vous allez créer un fichier projet C#. Vous pouvez choisir de créer un fichier projet Visual Basic à la place. Dans le contexte de ce didacticiel, la différence entre les deux fichiers projet est mineure.
Pour créer un fichier projet
Ouvrez Visual Studio et créez un projet :
Dans la zone de recherche, tapez
winforms
, puis choisissez Créer une application Windows Forms (.NET Framework). Dans la boîte de dialogue qui s’affiche, choisissez Créer.Dans la zone Nom du projet, tapez
BuildApp
. Entrez un Emplacement pour la solution, par exemple : D:\.Cliquez sur OK ou Créer pour créer le fichier projet.
Examiner le fichier projet
Dans la section précédente, vous avez utilisé Visual Studio pour créer un fichier projet C#. Le fichier projet est représenté dans l’Explorateur de solutions par le nœud de projet nommé BuildApp. Vous pouvez utiliser l’éditeur de code Visual Studio pour examiner le fichier projet.
Pour examiner le fichier projet
Dans Explorateur de solutions, cliquez sur le nœud du projet BuildApp.
Dans le navigateur Propriétés, notez que la propriété Fichier projet s’appelle BuildApp.csproj. Tous les fichiers projet sont nommés avec le suffixe proj. Si vous aviez créé un projet Visual Basic, le nom du fichier projet serait BuildApp.vbproj.
Cliquez à nouveau avec le bouton droit sur le nœud du projet, puis cliquez sur Modifier buildApp.csproj.
Le fichier projet apparaît dans l’éditeur de code.
Remarque
Pour certains types de projet, tels que C++, vous devez décharger le projet (cliquez avec le bouton droit sur le fichier projet et choisissez décharger le projet) avant de pouvoir ouvrir et modifier le fichier projet.
Cibles et tâches
Les fichiers projet sont des fichiers au format XML avec le nœud racine Project.
La plupart des projets .NET ont un attribut Sdk
. Ces projets sont appelés projets de style SDK. Le référencement d’un KIT de développement logiciel (SDK) signifie que MSBuild importe un ensemble de fichiers qui fournissent l’infrastructure de build pour ce KIT SDK. Si vous ne référencez aucun SDK, vous pouvez toujours utiliser MSBuild, mais vous n’avez pas automatiquement toutes les propriétés et cibles spécifiques au Kit de développement logiciel (SDK) disponibles.
<Project Sdk="Microsoft.NET.Sdk">
Il existe de nombreuses variantes des kits SDK .NET à des fins spéciales ; ils sont décrits dans kits SDK .NET Project.
Le processus de création d’une application est effectué avec les éléments Cible et Tâche.
Une tâche est la plus petite unité de travail, en d’autres termes, l'« atome » d’une construction. Les tâches sont des composants exécutables indépendants, qui peuvent avoir des entrées et des sorties. Aucune tâche n’est actuellement référencée ou définie dans le fichier projet. Vous ajoutez des tâches au fichier projet dans les sections suivantes. Pour plus d’informations, consultez Tâches.
Une cible est une séquence nommée de tâches. Il peut s’agir d’une séquence nommée de tâches, mais de manière critique, il représente quelque chose à créer ou à faire. Il doit donc être défini de manière orientée objectif. Pour plus d’informations, consultez l’article Cibles.
La cible par défaut n’est pas définie dans le fichier projet. Au lieu de cela, elle est spécifiée dans les projets importés. L’élément import spécifie les projets importés. Par exemple, dans un projet C#, la cible par défaut est importée à partir du fichier Microsoft.CSharp.targets.
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Les fichiers importés sont insérés efficacement dans le fichier projet où qu’ils soient référencés.
Dans les projets de style SDK, vous ne voyez pas cet élément d’importation, car l’attribut sdk entraîne l’importation implicite de ce fichier.
MSBuild effectue le suivi des cibles d’une build et garantit que chaque cible n’est générée qu’une seule fois.
Ajouter une cible et une tâche
Ajoutez une cible au fichier projet. Ajoutez une tâche à la cible qui imprime un message.
Ajouter une cible et une tâche
Ajoutez ces lignes au fichier projet, juste après l’instruction Import ou l’élément Project ouvrant.
<Target Name="HelloWorld"> </Target>
Ce code crée une cible nommée HelloWorld. Notez qu’IntelliSense est activé quand vous modifiez le fichier projet.
Ajoutez des lignes à la cible HelloWorld afin que la section résultante ressemble à ceci :
<Target Name="HelloWorld"> <Message Text="Hello"></Message> <Message Text="World"></Message> </Target>
Enregistrez le fichier projet.
La tâche Message
est l’une des nombreuses tâches fournies avec MSBuild. Pour obtenir la liste complète des tâches disponibles et des informations d’utilisation, consultez référence de tâche.
La tâche Message
prend la valeur de chaîne de l’attribut Text
comme entrée et l’affiche sur le périphérique de sortie (ou l’écrit dans un ou plusieurs logs, le cas échéant). La cible HelloWorld
exécute la tâche 'Message' à deux reprises : d'abord pour afficher « Bonjour », puis pour afficher « Monde ».
Générer la cible
Si vous essayez de générer ce projet à partir de Visual Studio, il ne génère pas la cible que vous avez définie. C’est parce que Visual Studio choisit la cible par défaut, qui est toujours celle du fichier .targets
importé.
Exécutez MSBuild à partir de l’Invite de commandes développeur pour Visual Studio pour générer la cible HelloWorld définie précédemment. Utilisez le commutateur de ligne de commande -target
ou -t
pour sélectionner la cible.
Note
Dans les sections suivantes, nous désignerons l’Invite de commandes développeur par fenêtre Commande.
Pour générer la cible :
Ouvrez la fenêtre de commande .
Dans la zone de recherche de la barre des tâches, commencez à taper le nom de l’outil, tel que
dev
oudeveloper command prompt
. Une liste d’applications installées qui correspondent à votre modèle de recherche s’affiche.Si vous devez le trouver manuellement, le fichier est LaunchDevCmd.bat dans le dossier {Dossier d’installation de Visual Studio}\Common7\Tools dossier.
Dans la fenêtre de commande, accédez au dossier contenant le fichier projet, dans ce cas, D :\BuildApp\BuildApp.
Exécutez msbuild avec le commutateur de commandes
-t:HelloWorld
. Cette commande sélectionne et génère la cible HelloWorld :msbuild buildapp.csproj -t:HelloWorld
Examinez la sortie dans la fenêtre commande . Vous devez voir les deux lignes « Hello » et « World » :
Hello World
Note
Si vous voyez plutôt The target "HelloWorld" does not exist in the project
, vous avez probablement oublié d’enregistrer le fichier projet dans l’éditeur de code. Enregistrez le fichier et réessayez.
En alternant entre l’éditeur de code et la fenêtre de commande, vous pouvez modifier le fichier projet et afficher rapidement les résultats.
Propriétés de build
Les propriétés de compilation sont des paires nom-valeur qui orientent le processus de compilation. Plusieurs propriétés de build sont déjà définies en haut du fichier projet :
<PropertyGroup>
...
<ProductVersion>10.0.11107</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{30E3C9D5-FD86-4691-A331-80EA5BA7E571}</ProjectGuid>
<OutputType>WinExe</OutputType>
...
</PropertyGroup>
Toutes les propriétés sont des éléments enfants des éléments PropertyGroup. Le nom de la propriété est le nom de l’élément enfant, et la valeur de la propriété est l’élément de texte de l’élément enfant. Par exemple
<TargetFrameworkVersion>net8.0</TargetFrameworkVersion>
définit la propriété nommée TargetFrameworkVersion
, en lui donnant la valeur de chaîne « net8.0 »
Les propriétés de construction peuvent être redéfinies à tout moment. Si
<TargetFrameworkVersion>net6.0</TargetFrameworkVersion>
apparaît ultérieurement dans le fichier projet, ou dans un fichier importé ultérieurement dans le fichier projet, puis TargetFrameworkVersion
prend la nouvelle valeur « net6.0 »
Examiner une valeur de propriété
Pour obtenir la valeur d’une propriété, utilisez la syntaxe suivante, où PropertyName
est le nom de la propriété :
$(PropertyName)
Utilisez cette syntaxe pour examiner certaines des propriétés du fichier projet.
Pour examiner une valeur de propriété
À partir de l’éditeur de code, remplacez la cible HelloWorld par ce code :
<Target Name="HelloWorld"> <Message Text="Configuration is $(Configuration)" /> <Message Text="MSBuildToolsPath is $(MSBuildToolsPath)" /> </Target>
Enregistrez le fichier projet.
À partir de la fenêtre de commande , entrez et exécutez cette ligne :
msbuild buildapp.csproj -t:HelloWorld
Examinez le résultat. Vous devez voir ces deux lignes (votre sortie peut différer) :
Configuration is Debug MSBuildToolsPath is C:\Program Files\Microsoft Visual Studio\2022\MSBuild\Current\Bin\amd64
Configuration is Debug MSBuildToolsPath is C:\Program Files (x86)\Microsoft Visual Studio\2019\MSBuild\16.0\Bin
Propriétés conditionnelles
De nombreuses propriétés telles que Configuration
sont définies de manière conditionnelle, autrement dit, l’attribut Condition
apparaît dans l’élément de propriété. Les propriétés conditionnelles sont définies ou redéfinies uniquement si la condition prend la valeur « true ». Les propriétés non définies reçoivent la valeur par défaut d’une chaîne vide. Par exemple
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
signifie « Si la propriété Configuration n’a pas encore été définie, définissez-la et donnez-lui la valeur « Déboguer ».
Presque tous les éléments MSBuild peuvent avoir un attribut Condition
. Pour plus d’informations sur l’utilisation de l’attribut Condition
, consultez Conditions.
Propriétés réservées
MSBuild réserve certains noms de propriétés pour stocker des informations sur le fichier projet et les fichiers binaires MSBuild. MSBuildToolsPath est un exemple de propriété réservée. Les propriétés réservées sont référencées avec la notation $
comme n’importe quelle autre propriété. Pour plus d’informations, consultez Guide pratique pour référencer le nom ou l’emplacement du fichier projet et Propriétés réservées et connues de MSBuild.
Variables d’environnement
Vous pouvez référencer des variables d’environnement dans les fichiers projet de la même façon que les propriétés de build. Par exemple, pour utiliser la variable d’environnement PATH
dans votre fichier projet, utilisez $(Path
). Si le projet contient une définition de propriété portant le même nom qu’une variable d’environnement, la propriété du projet remplace la valeur de la variable d’environnement. Pour plus d’informations, consultez Comment utiliser des variables d'environnement dans une build.
Définir des propriétés à partir de la ligne de commande
Les propriétés peuvent être définies sur la ligne de commande à l’aide du commutateur de ligne de commande -property
ou -p
. Les valeurs de propriété reçues de la ligne de commande remplacent les valeurs de propriété définies dans le fichier projet et les variables d’environnement.
Pour définir une valeur de propriété à partir de la ligne de commande :
À partir de la fenêtre de commande , entrez et exécutez cette ligne :
msbuild buildapp.csproj -t:HelloWorld -p:Configuration=Release
Examinez le résultat. Vous devez voir cette ligne :
Configuration is Release.
MSBuild crée la propriété Configuration et lui donne la valeur « Release ».
Caractères spéciaux
Certains caractères ont une signification particulière dans les fichiers projet MSBuild. Par exemple, ces caractères incluent des points-virgules (;
) et des astérisques (*
). Pour utiliser ces caractères spéciaux comme littéraux dans un fichier projet, ils doivent être spécifiés à l’aide de la syntaxe %<xx>
, où <xx>
représente la valeur hexadécimale ASCII du caractère.
Modifiez la tâche Message pour afficher la valeur de la propriété Configuration avec des caractères spéciaux pour le rendre plus lisible.
Pour utiliser des caractères spéciaux dans la tâche message :
À partir de l’éditeur de code, remplacez les deux tâches message par cette ligne :
<Message Text="%24(Configuration) is %22$(Configuration)%22" />
Enregistrez le fichier projet.
À partir de la fenêtre de commande , entrez et exécutez cette ligne :
msbuild buildapp.csproj -t:HelloWorld
Examinez le résultat. Vous devez voir cette ligne :
$(Configuration) is "Debug"
Pour plus d'informations, consultez les caractères spéciaux MSBuild .
Générer des éléments
Un élément est une information, généralement un nom de fichier, utilisé comme entrée dans le système de génération. Par exemple, une collection d’éléments représentant des fichiers sources peut être passée à une tâche nommée Compile pour les compiler dans un assembly.
Tous les éléments sont des éléments enfants des éléments ItemGroup. Le nom de l’élément est le nom de l’élément enfant, et la valeur de l’élément est la valeur de l’attribut Include de l’élément enfant. Les valeurs des éléments qui ont le même nom sont regroupées en types d’éléments de ce nom. Par exemple
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
définit un groupe d’éléments contenant deux éléments. Le type d’élément Compile a deux valeurs : Program.cs et Properties\AssemblyInfo.cs.
Le code suivant crée le même type d’élément en déclarant les deux fichiers dans un attribut Include
, séparés par un point-virgule.
<ItemGroup>
<Compile Include="Program.cs;Properties\AssemblyInfo.cs" />
</ItemGroup>
Pour plus d’informations, consultez l’article Éléments.
Note
Les chemins d’accès aux fichiers sont relatifs au dossier contenant le fichier projet MSBuild, même si le fichier projet est un fichier projet importé. Il existe quelques exceptions à cela, par exemple lors de l’utilisation des éléments Import et UsingTask.
Examiner les valeurs de type d’élément
Pour obtenir les valeurs d’un type d’élément, utilisez la syntaxe suivante, où ItemType
est le nom du type d’élément :
@(ItemType)
Utilisez cette syntaxe pour examiner le type d’élément Compile
dans le fichier projet.
Pour examiner les valeurs de type d’élément :
À partir de l’éditeur de code, remplacez la tâche cible HelloWorld par ce code :
<Target Name="HelloWorld"> <Message Text="Compile item type contains @(Compile)" /> </Target>
Enregistrez le fichier projet.
À partir de la fenêtre de commande , entrez et exécutez cette ligne :
msbuild buildapp.csproj -t:HelloWorld
Examinez le résultat. Vous devez voir cette longue ligne :
Compile item type contains Form1.cs;Form1.Designer.cs;Program.cs;Properties\AssemblyInfo.cs;Properties\Resources.Designer.cs;Properties\Settings.Designer.cs
Les valeurs d’un type d’élément sont séparées par des points-virgules par défaut.
Pour modifier le séparateur d’un type d’élément, utilisez la syntaxe suivante, où ItemType est le type d’élément et séparateur est une chaîne d’un ou plusieurs caractères de séparation :
@(ItemType, Separator)
Modifiez la tâche Message
pour utiliser les retours à la ligne et les sauts de ligne (%0A%0D) afin d'afficher un élément Compile par ligne.
Pour afficher les valeurs de type d’élément une par ligne
À partir de l’éditeur de code, remplacez la tâche Message par cette ligne :
<Message Text="Compile item type contains @(Compile, '%0A%0D')" />
Enregistrez le fichier projet.
À partir de la fenêtre de commande , entrez et exécutez cette ligne :
msbuild buildapp.csproj -t:HelloWorld
Examinez le résultat. Vous devez voir ces lignes :
Compile item type contains Form1.cs Form1.Designer.cs Program.cs Properties\AssemblyInfo.cs Properties\Resources.Designer.cs Properties\Settings.Designer.cs
Inclure, Exclure et caractères génériques
Vous pouvez utiliser les caractères génériques « * », « ** » et « ? » avec l’attribut Include
pour ajouter des éléments à un type d’élément. Par exemple
<Photos Include="images\*.jpeg" />
ajoute tous les fichiers avec l'extension de fichier .jpeg au dossier images pour le type d'élément Photos, tandis que
<Photos Include="images\**\*.jpeg" />
ajoute tous les fichiers avec l’extension de fichier .jpeg dans les images dossier, et tous ses sous-dossiers, au type d’élément Photos. Pour plus d’exemples, consultez Guide pratique pour sélectionner les fichiers à générer.
Notez que lorsque les éléments sont déclarés, ils sont ajoutés au type d’élément. Par exemple
<Photos Include="images\*.jpeg" />
<Photos Include="images\*.gif" />
crée un type d’élément nommé Photo qui contient tous les fichiers dans le dossier d'images ayant pour extension de fichier .jpeg
ou .gif
. Ces lignes sont équivalentes à la ligne suivante :
<Photos Include="images\*.jpeg;images\*.gif" />
Vous pouvez exclure un élément d’un type d’élément avec l’attribut Exclude
. Par exemple
<Compile Include="*.cs" Exclude="*Designer*">
ajoute tous les fichiers avec l’extension de fichier .cs au type d’élément Compile
, à l’exception des fichiers dont les noms contiennent la chaîne Designer. Pour plus d’exemples, consultez Guide pratique pour exclure des fichiers de la build.
L’attribut Exclude
affecte uniquement les éléments ajoutés par l’attribut Include
dans l’élément d’élément qui les contient les deux. Par exemple
<Compile Include="*.cs" />
<Compile Include="*.res" Exclude="Form1.cs">
n’exclurait pas le fichier Form1.cs, qui a été ajouté dans l’élément précédent.
Pour inclure et exclure des éléments
À partir de l’éditeur de code, remplacez la tâche Message par cette ligne :
<Message Text="XFiles item type contains @(XFiles)" />
Ajoutez ce groupe d’éléments juste après l’élément Import :
<ItemGroup> <XFiles Include="*.cs;properties/*.resx" Exclude="*Designer*" /> </ItemGroup>
Enregistrez le fichier projet.
À partir de la fenêtre de commande , entrez et exécutez cette ligne :
msbuild buildapp.csproj -t:HelloWorld
Examinez le résultat. Vous devez voir cette ligne :
XFiles item type contains Form1.cs;Program.cs;Properties/Resources.resx
Métadonnées de l’élément
Les éléments peuvent contenir des métadonnées en plus des informations collectées à partir des attributs Include
et Exclude
. Les tâches qui nécessitent plus d’informations sur les éléments que la valeur de l’élément peuvent utiliser ces métadonnées.
Les métadonnées d’élément sont déclarées dans le fichier projet en créant un élément portant le nom des métadonnées en tant qu’élément enfant de l’élément. Un élément peut avoir zéro ou plusieurs valeurs de métadonnées. Par exemple, l’élément CSFile suivant a des métadonnées culture avec la valeur « Fr » :
<ItemGroup>
<CSFile Include="main.cs">
<Culture>Fr</Culture>
</CSFile>
</ItemGroup>
Pour obtenir la valeur des métadonnées d’un type d’élément, utilisez la syntaxe suivante, où ItemType
est le nom du type d’élément et MetaDataName est le nom des métadonnées :
%(ItemType.MetaDataName)
Pour examiner les métadonnées d’élément :
À partir de l’éditeur de code, remplacez la tâche Message par cette ligne :
<Message Text="Compile.DependentUpon: %(Compile.DependentUpon)" />
Enregistrez le fichier projet.
À partir de la fenêtre de commande , entrez et exécutez cette ligne :
msbuild buildapp.csproj -t:HelloWorld
Examinez le résultat. Vous devez voir ces lignes :
Compile.DependentUpon: Compile.DependentUpon: Form1.cs Compile.DependentUpon: Resources.resx Compile.DependentUpon: Settings.settings
Notez que l’expression « Compile.DependentUpon » s’affiche plusieurs fois. L’utilisation de métadonnées avec cette syntaxe au sein d’une cible provoque le « traitement par lots ». Le traitement par lots signifie que les tâches au sein de la cible sont exécutées une fois pour chaque valeur de métadonnées unique. Le batching est l'équivalent dans les scripts MSBuild de la structure de programmation commune "boucle foreach". Pour plus d’informations, consultez l’article Traitement par lot.
Métadonnées connues
Chaque fois qu’un élément est ajouté à une liste d’éléments, cet élément reçoit des métadonnées connues. Par exemple, %(Filename)
retourne le nom de fichier d’un élément. Pour obtenir la liste complète des métadonnées connues, consultez l’article Métadonnées d'éléments connus.
Pour examiner les métadonnées connues :
À partir de l’éditeur de code, remplacez la tâche Message par cette ligne :
<Message Text="Compile Filename: %(Compile.Filename)" />
Enregistrez le fichier projet.
À partir de la fenêtre de commande , entrez et exécutez cette ligne :
msbuild buildapp.csproj -t:HelloWorld
Examinez le résultat. Vous devez voir ces lignes :
Compile Filename: Form1 Compile Filename: Form1.Designer Compile Filename: Program Compile Filename: AssemblyInfo Compile Filename: Resources.Designer Compile Filename: Settings.Designer
En comparant les deux exemples précédents, vous pouvez constater que, bien que tous les éléments du type Compile
n'aient pas de métadonnées DependentUpon, ils ont tous les métadonnées bien connues de nom de fichier.
Transformations de métadonnées
Les listes d’éléments peuvent être transformées en nouvelles listes d’éléments. Pour transformer une liste d’éléments, utilisez la syntaxe suivante, où <ItemType>
est le nom du type d’élément et <MetadataName>
est le nom des métadonnées :
@(ItemType -> '%(MetadataName)')
Par exemple, une liste d’éléments de fichiers sources peut être transformée en une collection de fichiers objet à l’aide d’une expression telle que @(SourceFiles -> '%(Filename).obj')
. Pour plus d’informations, consultez Transforms.
Pour transformer des éléments à l’aide de métadonnées :
À partir de l’éditeur de code, remplacez la tâche Message par cette ligne :
<Message Text="Backup files: @(Compile->'%(filename).bak')" />
Enregistrez le fichier projet.
À partir de la fenêtre de commande , entrez et exécutez cette ligne :
msbuild buildapp.csproj -t:HelloWorld
Examinez le résultat. Vous devez voir cette ligne :
Backup files: Form1.bak;Form1.Designer.bak;Program.bak;AssemblyInfo.bak;Resources.Designer.bak;Settings.Designer.bak
Notez que les métadonnées exprimées dans cette syntaxe ne provoquent pas de traitement par lots.
Étapes suivantes
Pour savoir comment créer un fichier projet simple une étape à la fois, sur Windows, essayez Créer un fichier projet MSBuild à partir de zéro.
Si vous utilisez principalement le Kit de développement logiciel (SDK) .NET, veuillez poursuivre la lecture de la section Référence MSBuild pour les projets SDK .NET.