web-dev-qa-db-fra.com

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

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

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

Malheureusement, je reçois des erreurs telles que:

Erreur CS8026: La fonctionnalité 'expression-bodied property' n'est pas disponible en C # 5. Veuillez utiliser le langage version 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 langue version 6 ou supérieure.

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

Comme je ne comprends pas sa solution et que je souhaite que la solution soit 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 de C # 6?

110
Uwe Keim

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

Fournisseurs CodeDOM pour le compilateur .NET ...

Fournisseurs de remplacement CodeDOM qui utilisent le nouveau compilateur .NET Compiler Platform ("Roslyn") en tant qu'API de service. Cela permet la prise en charge de nouvelles fonctionnalités linguistiques dans les systèmes utilisant CodeDOM (par exemple, la compilation d'exécution ASP.NET), ainsi que l'amélioration des 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 les éléments suivants à votre fichier 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>

Si c'est toujours manquant. Essayez de vous ajouter.

109
jbtule

Voir aussi cet article de blog de Sayed Ibrahim Hashimi pour savoir comment procéder via l'EDI de VS.

Dans Visual Studio 2015 Update 1, nous avons inclus une nouvelle fonctionnalité pour simplifier cela. Lorsque vous avez une solution ouverte comportant au moins un projet Web qui cible .NET 4.5+ et ne contient pas le package DotNetCompilerPlatform NuGet dans le menu Projet, une nouvelle option, Activer C # 6/VB, s'affiche. _ 14 apparaissent.
enter image description here

47
Vertigo

J'ai installé DotNetCompilerPlatform comme suggéré par @jbtule, mais je continuais à avoir 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. Maintenant, les fonctionnalités de C # 6 fonctionnent.

14
Jon Crowell

Solutions possibles, tirées de les commentaires sur le blog de ScottG (recherchez "8026" sur la page):

Proposition de solution 1 (David Taylor)

Ajoutez ces RTM _ éléments de code dom au 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 à configurer, mais je trouvais étrange que le modèle par défaut ne soit pas configuré si vous avez sélectionné .NET 4.6 lors de la création d'un nouveau "site Web" dans VS 2015 RTM.

Proposition de solution 2 (Martin)

Pour faire suite au commentaire de David Taylor ci-dessus, il semble que les paramètres system.codedom soient corrects lorsqu'une application Web est créée avec TargetFramework comme v4.5.2 par défaut. La modification de TargetFramework à v4.6 semble modifier les paramètres du compilateur pour CSharp, ce qui entraîne des problèmes.

Mes solutions de contournement étaient les suivantes:

  1. Fichier/Nouveau/Application Web ASP.NET
  2. Sélectionnez le modèle "Web API" à partir de 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 le cadre cible sur 4.6.
  5. Remplacez l'élément system.codedom modifié dans web.config par la copie réalisée avant de modifier TargetFramework.
  6. Frappé F5

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

Pour information, le contenu de system.codedom immédiatement après le changement de 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>
12
Uwe Keim

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

Vous pouvez basculer sur C # 6 dans l'interface utilisateur de Visual Studio. C’est une option si facile qu’il vaut la peine d’essayer d’abord.

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

enter image description here

7
Jess

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

enter image description here

4
b_levitt

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

2
ComeIn