Comment mettre à niveau msbuild vers C # 6?

106

Je souhaite utiliser C # 6 dans mon projet (propagation nulle, autres fonctionnalités).

J'ai installé VS 2015 sur mon PC et cela fonctionne à merveille et crée un code de test comme

var user = new SingleUserModel(); //all model fields are null
var test = user.User?.Avatar?["blah"];

Mais lorsque je pousse mon projet vers le référentiel et que CI commence à le générer, la génération échoue en raison d'une non prise en charge ?.

J'ai également installé VS2015 sur le serveur CI mais il semble qu'il ne l'utilise pas. Que puis-je faire?

CI - CruiseControl .NET Construit avec C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

Anna Prosvetova
la source
3
Pour quiconque télécharge MS Build Tools 2015 à partir des liens ci-dessous, ils sont pour une ancienne version (pré-mise à jour) qui a des bogues ... J'ai trouvé un lien ici vers la mise à jour 3 de 2015
bdrajer

Réponses:

164

Assurez-vous d'appeler:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe

C'est la version de MsBuild fournie avec Visual Studio 2015 et appelle le compilateur C # qui comprend cela. Vous pouvez obtenir cette version de MsBuild sur votre système en installant n'importe quelle édition de Visual Studio 2015 ou en installant les outils autonomes Microsoft Build 2015 .

L'ajout d'une référence au package NuGet suivant forcera également l'utilisation du nouveau compilateur:

Install-Package Microsoft.Net.Compilers

Veuillez noter qu'Install-Package choisira la dernière version disponible qui peut ne pas être celle que vous recherchez. Avant d'installer, veuillez consulter les notes de publication et les dépendances pour résoudre le problème sous-jacent avec la version traitée, qui dans ce cas, était plus spécifique à VS 2015.

Donc pour Visual Studio 2015:

Install-Package Microsoft.Net.Compilers -Version 1.0.0
jessehouwing
la source
2
y a-t-il des inquiétudes à propos de ce qui cause des bogues depuis le RyuJIT ou quoi que ce soit qui a tant de bogues?
Maslow
3
Juste une note à ce sujet, si vous mettez à jour votre variable d'environnement PATH, assurez-vous de supprimer l'ancien emplacement (ex: C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319) car il peut toujours l'appeler lors de l'exécution de "msbuild "de cmd
TheWebGuy
2
J'ai également dû installer le package nuget Microsoft.Net.Compilers: voir stackoverflow.com/a/36774876/584714
DrGriff
2
Existe-t-il une solution à cela sans avoir à installer un package nuget dans chaque projet? J'ai des centaines de projets qui en auraient besoin et cela me semble inutile. On dirait un bug quelque part.
Cole W
2
Quelqu'un a-t-il une réponse à la question @ColeW?
Zinov
61

Vous pouvez d'ailleurs également installer les "Microsoft Build Tools 2015" au lieu de VS2015 sur votre serveur de build.

https://www.microsoft.com/en-us/download/details.aspx?id=48159

Il installe MSBuild sur le même chemin:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe
MuhKuh
la source
IMHO il y a une cause, pourquoi la question porte sur cet environnement. Mieux vaut faire un commentaire sur la question.
jogo du
24
Comme stackoverflow ne me permet pas de commenter les questions, je l'ai posté de la seule manière que les systèmes me permettent. Et si vous ne le trouvez pas utile, ignorez-le. Pour moi, tout en recherchant la solution sur mon serveur de build, c'était la voie à suivre, au lieu d'installer VS2015
MuhKuh
Une fois que vous avez installé «Microsoft Build Tools 2015» (ou «Microsoft Build Tools 2017»), vous contrôlez également la version de Visual Studio que vous souhaitez utiliser pour créer la solution: MSBuild.exe / t: Build YourSolution.sln / p : VisualStudioVersion = 14.0 [réglez-le sur 10.0 pour VS2010, sur 14.0 pour VS2015 et 15.0 pour VS2017]
Alex Sanséau
Pour télécharger et installer Microsoft Build Tools 2015 Update 3 , visitez les anciens téléchargements VS et accédez à la Redistributables and Build Toolssection.
RBT
12

Cela fonctionne probablement déjà, mais cela pourrait aider quelqu'un d'autre à l'avenir. Je suis tombé sur cette question récemment et cela m'a fait avancer dans la bonne direction et a finalement conduit à une solution.

Une autre solution possible consiste à mettre à jour manuellement vos fichiers de projet pour cibler la version MSBuild avec laquelle vous souhaitez que vos projets soient créés.

J'ai récemment effectué une mise à jour du serveur de build TeamCity et j'y ai déjà installé Microsoft Build Tools 2015. Je pensais que tout était en place sur le serveur de build, j'avais ma solution ciblant C # 6.0 et j'avais tous les projets ciblant .net 4.6.1. Comme vous, tout avec du code spécifique à C # 6.0 est parfaitement construit dans mon environnement local, mais mon serveur de build TeamCity n'aimait rien de tout cela.

Comme mentionné par d'autres, j'ai essayé d'utiliser le package NuGet Microsoft.Net.Compilers. La dernière version de celui-ci permettait à la construction de fonctionner sur mon serveur de construction, mais elle ne me permettait pas de publier mon code localement (une exigence de la mienne). Les versions antérieures de ce package NuGet me permettaient de publier, mais la compilation ne fonctionnerait pas.

Ce que j'ai trouvé que je devais faire était finalement de modifier chaque fichier de projet dans ma solution pour cibler spécifiquement la version MSBuild qui pourrait gérer le code C # 6.0. Dans chacun de mes fichiers de projet, j'ai trouvé une ligne similaire à la ligne suivante:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

le composant clé de cette ligne étant la partie ToolsVersion de celle-ci. J'ai simplement changé cette ligne sur mes fichiers de projet pour lire ce qui suit:

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

La différence ici était que je ciblais la version 14, pas 4. La version 14.0 correspond à Build Tools 2015. En changeant cela, mon serveur de build TeamCity a utilisé la version MSBuild correcte et a pu créer mon code C # 6.0.

J'ai également dû mettre à jour manuellement le nœud xml TargetFrameworkVersion de celui-ci pour utiliser 4.6.1 parce que VS2015 ne faisait pas quelque chose de bien et a gâché ma version locale, mais ce n'est pas pertinent ici.

S'il vous plaît, quelqu'un me corrige si je me trompe, mais juste pour référence, je pense que les numéros de version ressemblent à ceci:

4,0 = VS2012

12,0 = VS2013

14,0 = VS2015

15,0 = VS2017

Je pense que si vous vouliez utiliser .net 4.7, vous devrez installer les outils de construction 2017 et vos projets ciblant 15,0 au lieu de 14,0, mais je ne l'ai pas vérifié.

user1059903
la source