Comment utiliser C # 6 avec le type de projet Site Web?

126

Mise à jour d'un type de projet de site Web existant Visual Studio 2015, j'ai changé le Framework en 4.6.

Je m'attendais alors à avoir toutes ces nouvelles fonctionnalités disponibles dans mon code derrière des fichiers.

Malheureusement, j'obtiens des erreurs comme:

Erreur CS8026: La fonctionnalité «propriété à corps d'expression» n'est pas disponible dans C # 5. Veuillez utiliser la version linguistique 6 ou supérieure.

ou par exemple:

Erreur CS8026: la fonctionnalité «chaînes interpolées» n'est pas disponible en C # 5. Veuillez utiliser la version linguistique 6 ou supérieure.

J'ai fait une vérification rapide sur Google et j'ai trouvé un gars qui publiait des commentaires dans un article de blog de ScottGu (recherchez "8026" sur la page).

Comme je ne comprends pas sa solution, et que je souhaite en plus avoir la solution plus visible, j'ai créé cette publication SO.

Ma question:

Comment puis-je avoir un projet Visual Studio 2015 de type Site Web (c'est-à-dire pas Application Web ) pour reconnaître les fonctionnalités C # 6?

Uwe Keim
la source
1
Avez-vous essayé d'ajouter les éléments de configuration qu'il a mentionnés dans le commentaire?
scheien
Je suis sur le point de le faire, mais il semble vraiment étrange pour moi , donc je me attendais à une solution plus propre.
Uwe Keim
5
Bien sûr, l'autre option est d'arrêter d'utiliser ces "projets" de site Web et d'utiliser à la place des projets d'application Web.
John Saunders
1
@JohnSaunders Je l' amour de le faire. La migration étant une tâche manuelle, je crains le temps qu'elle prendra et toutes les erreurs que je vais introduire lors de la migration. Je l'ai fait plusieurs fois pour des projets plus petits. Always was a hassle ...
Uwe Keim
1
Heureux que vous y ayez pensé. Le commentaire s'adressait principalement à d'autres lecteurs qui pourraient penser qu'un projet de "site Web" ressemble à ce qu'ils veulent.
John Saunders

Réponses:

118

J'ai testé cela avec ASP.NET MVC 5 (testé 5.2.3), et votre kilométrage peut varier avec d'autres frameworks Web, mais il vous suffit d'ajouter le Roslyn CodeDOM | NuGet package

Fournisseurs CodeDOM pour le compilateur .NET ...

Fournisseurs CodeDOM de remplacement qui utilisent le nouveau compilateur .NET Compiler Platform ("Roslyn") comme API de service. Cela permet de prendre en charge de nouvelles fonctionnalités de langage dans les systèmes utilisant CodeDOM (par exemple, la compilation d'exécution ASP.NET) ainsi que d'améliorer les performances de compilation de ces systèmes.

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/

Le package NuGet doit ajouter les fichiers DLL et ajouter les éléments suivants à votre web.config.

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>

S'il manque toujours. Essayez de vous ajouter.

jbtule
la source
1
Cela fonctionne comme prévu. C # 6 maintenant disponible. L'inconvénient est que mon App_GlobalResources / Resources.resx ne génère plus la classe automatique pour accéder aux ressources de manière fortement typée.
Uwe Keim
1
En guise de note, j'ai pu construire sans erreur après que la cible du projet ait été modifiée en 4.6. Cependant, j'avais besoin d'installer ce package pour résoudre les squigglies rouges apparaissant à partir d'intellisense.
Doug Morrow
7
J'utilise ceci dans un site Web WebForms (pas de fichier de projet). Malheureusement, de simples modifications .aspx déclenchent une recompilation douloureusement plus lente lors de la nouvelle demande de la page dans un navigateur. Peut-être que Roslyn est théoriquement plus rapide pour une application Web (avec fichier proj), mais pour les sites Web, cela semble être beaucoup plus lent via csc dans le dossier App_Code ... Quelqu'un voit la même chose?
Stefan Anghel
4
Remarque: pour que WebForms compile avec C # 6, vous devez installer les packages NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatformet ses dépendancesMicrosoft.Net.Compilers
3
Notez que si vous avez plus d'un site Web dans votre solution - les choses ne fonctionneront pas, le moyen le plus simple de reproduire est de créer une solution vide et de commencer à y ajouter des projets, après le deuxième site Web - vous commencerez à recevoir "impossible de trouver csc.exe" errors
mac
67

Voir également ce billet de blog de Sayed Ibrahim Hashimi sur la façon de procéder via VS IDE.

Dans Visual Studio 2015 Update 1, nous avons inclus une nouvelle fonctionnalité pour simplifier cela. Lorsque vous avez une solution ouverte qui a au moins un projet Web qui cible .NET 4.5+ et qui n'a pas le package DotNetCompilerPlatform NuGet dans le menu Projet, vous verrez une nouvelle option, Activer C # 6 / VB 14 apparaît.
entrez la description de l'image ici

Mettre à jour.

VS 2017 et 2019 ont cette fonctionnalité déplacée vers Build -> ASP.NET Compilation . entrez la description de l'image ici

vertige
la source
2
Savez-vous où se trouve cet élément dans Visual Studio 2019?
Protector one
4
@ protector-one Build -> Compilation ASP.NET
Vertigo
1
J'ai ouvert un ancien projet de site Web basé sur des dossiers dans VS2019 et j'ai dû Fichier> Enregistrer le projet avant que cette option n'apparaisse.
Corgalore
15

J'ai installé DotNetCompilerPlatform comme le suggérait @jbtule, mais j'obtenais toujours les mêmes erreurs.

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

J'ai fermé la solution, supprimé les dossiers bin et obj, puis ouvert la solution et reconstruit. Désormais, les fonctionnalités C # 6 fonctionnent.

Jon Crowell
la source
3
La fermeture et la réouverture de VS ont fonctionné pour moi (après Install-Package ...). Cibler également 4.6.
rwalter le
1
cela a fonctionné pour moi, également remarquer que l'utilisation de resharper pourrait montrer de fausses erreurs, m'a pris un certain temps pour comprendre pourquoi je reçois "Unable to resolution symbol" partout dans la vue ...
Niklas
1
Dans mon cas, j'ai juste dû attendre environ 30 secondes après la réouverture de la solution et cela a fonctionné sans avoir à supprimer binet obj.
Marc 2377
12

Solutions possibles, tirées des commentaires sur la publication du blog de ScottGu (recherchez "8026" sur la page):

Suggestion de solution 1 (David Taylor)

Ajoutez ces éléments de code RTM dom à web.config:

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
</system.codedom>

Ajoutez ensuite les éléments Roslyn et Microsoft.CodeDom.Providers. *. Dll dans votre répertoire BIN.

Il est assez facile à installer, mais il m'est juste étrange que le modèle par défaut ne soit pas configuré pour cela si vous avez sélectionné .NET 4.6 lors de la création d'un nouveau «site Web» dans VS 2015 RTM.

Suggestion de solution 2 (Martin)

Suite au commentaire de David Taylor ci-dessus, il semble que les paramètres system.codedom sont corrects lorsqu'une application Web est créée avec TargetFramework par défaut v4.5.2. La modification de TargetFramework en v4.6 semble modifier les paramètres du compilateur pour CSharp, d'une manière qui provoque un problème.

Mes solutions de contournement étaient les suivantes:

  1. Fichier / Nouveau / Application Web ASP.NET
  2. Sélectionnez le modèle "API Web" dans les modèles ASP.NET 4.5.2
  3. Prenez une copie de l'élément system.codedom (et de son contenu) dans web.config
  4. À l'aide de Properties / TargetFramework, définissez Target Framework sur 4.6
  5. Remplacez l'élément system.codedom modifié dans web.config par la copie prise avant de modifier TargetFramework
  6. Frappé F5

La page d'accueil doit se charger comme prévu.

Pour plus d'informations, le contenu de system.codedom immédiatement après avoir changé TargetFramework en v4.6. était comme suit (notez l'utilisation du type "Microsoft.CSharp.CSharpCodeProvider"):

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701">
            <providerOption name="CompilerVersion" value="v4.0"/>
        </compiler>
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
</system.codedom>
Uwe Keim
la source
3
En ce qui concerne votre solution 2, la Microsoft.CSharp.CSharpCodeProviderversion 4.0 signifie qu'elle n'utilise pas Rosyln, donc ne fonctionnera pas pour C # 6.0.
jbtule le
1
Lors de la migration à partir d'une solution plus ancienne, assurez-vous que <LangVersion>dans le csprojfichier est égal à 6. Cela peut causer des problèmes si c'est autre chose.
Saul
7

Ce n'est pas pour un projet de site Web . Voici comment procéder pour un projet ASP.NET MVC.

Vous pouvez basculer C # 6 dans l'interface utilisateur de Visual Studio. C'est une option tellement simple qu'il vaut la peine d'essayer en premier.

  1. Faites un clic droit sur votre projet et sélectionnez Propriétés .
  2. Cliquez sur le Build onglet .
  3. L'onglet Build a un Advanced ... bouton tout en bas.
  4. Cela ouvre les paramètres de construction avancés comme indiqué ci-dessous. Sélectionnez C # 6.0.

entrez la description de l'image ici

Jess
la source
@Manuzor vous avez peut-être raison. C'était pour un projet ASP.NET MVC.
Jess
@Ucho qu'est-ce qui ne va pas? Est-ce un projet MVC? Avez-vous l'option Avancé dans les paramètres de construction? Manque-t-il des options pour la version du langage C #? Avez-vous défini la version et ne pouvez pas utiliser les fonctionnalités linguistiques?
Jess
@Jess: Ah, ça marche probablement. Je n'ai pas remarqué que mon erreur provenait d'IntelliSense et non de build.
Ucho
Ce paramètre ne semble pas s'appliquer au code des pages aspx, par exemple <% Eval(whatever) %>.
Chris
5

Voici à quoi cela ressemble dans VS2017 avec un projet de site Web:

entrez la description de l'image ici

b_levitt
la source
J'apprécie le travail de recadrage @Uwe mais je ne pense pas être d'accord avec la suppression du reste de la navigation supérieure car le contexte est perdu pour savoir où cet élément de menu particulier devrait être.
b_levitt
1
Le dernier VS 2017 a déplacé cela vers 'Build -> ASP.NET Compilation'. Voir ma réponse mise à jour.
Vertigo
Pour les types de projets de site Web, j'ai testé la réponse de @ b_levitt sur VS2019. (1) Assurez-vous d'avoir un fichier web.config. Sinon, ajoutez-en un. (2) Enregistrez la solution en la sélectionnant dans l'Explorateur de solutions et en exécutant [Ctrl] + [S]. (3) Sélectionnez le projet sur l'Explorateur de solutions et modifiez le Framework cible à 4.7.2 (4) Sélectionnez l'option «Activer le dernier C # ...» dans le menu Générer> Compilation ASP.NET.
Denny Jacob le
2

J'ai reçu cette erreur après avoir apporté des modifications ZERO à mon projet WebAPI. J'ai désinstallé le package nuget DotNetCompilerPlatform et réinstallé, ce qui a résolu le problème.

Entrez
la source