Come utilizzare C # 6 con il tipo di progetto sito Web?


126

Aggiornato un sito Web esistente tipo di progetto di Visual Studio 2015, ho modificato il Framework in 4.6.

Quindi mi aspettavo di avere tutte quelle nuove funzionalità disponibili nel mio codice dietro i file.

Purtroppo ricevo errori come:

Errore CS8026: la funzionalità "proprietà con corpo di espressione" non è disponibile in C # 5. Utilizzare la versione della lingua 6 o successiva.

o ad esempio:

Errore CS8026: la funzionalità "stringhe interpolate" non è disponibile in C # 5. Utilizzare la versione della lingua 6 o successiva.

Ho fatto un rapido controllo su Google e ho trovato un ragazzo che pubblicava alcuni commenti in un post sul blog di ScottGu (cerca "8026" nella pagina).

Poiché non capisco la sua soluzione, in più voglio che la soluzione sia più visibile, ho creato questo messaggio SO.

La mia domanda:

Come posso avere un progetto Visual Studio 2015 di tipo Sito Web (cioè non Applicazione Web ) per riconoscere le funzionalità C # 6?


1
Hai provato ad aggiungere gli elementi di configurazione che ha menzionato nel commento?
scheien

Sto per farlo, ma sembra davvero strano per me , quindi mi aspettavo qualche soluzione più pulita.
Uwe Keim

5
Ovviamente, l'altra opzione è quella di smettere di usare quei "progetti" di siti web e usare invece Progetti di applicazioni web.
John Saunders

1
@JohnSaunders vorrei amare di farlo. Poiché la migrazione è un'attività manuale, temo il tempo necessario e tutti gli errori che introdurrò durante la migrazione. L'ho fatto alcune volte per progetti più piccoli. È sempre stata una seccatura ...
Uwe Keim

1
Sono contento che tu l'abbia considerato. Il commento è stato principalmente per altri lettori che potrebbero pensare che un progetto di "sito web" suoni come quello che vogliono.
John Saunders

Risposte:


118

L'ho testato con ASP.NET MVC 5 (testato 5.2.3) e il tuo chilometraggio può variare con altri framework web, ma devi solo aggiungere Roslyn CodeDOM | Pacchetto NuGet

Provider CodeDOM per compilatore .NET ...

Provider CodeDOM sostitutivi che utilizzano il nuovo compilatore .NET Compiler Platform ("Roslyn") come API del servizio. Ciò fornisce supporto per nuove funzionalità del linguaggio nei sistemi che utilizzano CodeDOM (ad es. Compilazione runtime ASP.NET) oltre a migliorare le prestazioni di compilazione di questi sistemi.

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

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

Il pacchetto NuGet dovrebbe aggiungere i file DLL e aggiungere quanto segue al tuo file 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>

Se manca ancora. Prova ad aggiungere te stesso.


1
Funziona come previsto. C # 6 ora disponibile. Lo svantaggio è che il mio App_GlobalResources / Resources.resx non genera più la classe automatica per l'accesso fortemente tipizzato alle risorse.
Uwe Keim

1
Come nota, sono stato in grado di creare senza errori dopo che l'obiettivo del progetto è stato modificato in 4.6. Tuttavia, avevo bisogno di installare questo pacchetto per risolvere gli squiggli rossi visualizzati da intellisense.
Doug Morrow

7
Lo sto usando in un sito Web WebForms (nessun file di progetto). Purtroppo, semplici modifiche .aspx attivano una ricompilazione dolorosamente più lenta quando si richiede nuovamente la pagina in un browser. Forse Roslyn è teoricamente più veloce per una WebApplication (con file proj), ma per i siti Web sembra essere significativamente più lento tramite csc nella cartella App_Code ... Qualcuno vede la stessa cosa?
Stefan Anghel

4
Nota, affinché WebForms si compili con C # 6, è necessario installare i pacchetti NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatforme le relative dipendenzeMicrosoft.Net.Compilers

3
Nota che se hai più di un sito web nella tua soluzione - le cose non funzioneranno, il modo più semplice per riprodurre è creare una soluzione vuota e iniziare ad aggiungere progetti in essa, dopo il secondo sito web - inizierai a ricevere "impossibile trovare csc.exe" errori
mac

67

Vedi anche questo post sul blog di Sayed Ibrahim Hashimi su come farlo tramite VS IDE.

In Visual Studio 2015 Update 1 abbiamo incluso una nuova funzionalità per semplificare questa operazione. Quando hai una soluzione aperta che ha almeno un progetto web che si rivolge a .NET 4.5+ e non ha il pacchetto NuGet DotNetCompilerPlatform nel menu Progetto vedrai una nuova opzione, Abilita C # 6 / VB 14.
inserisci qui la descrizione dell'immagine

Aggiornare.

VS 2017 e 2019 hanno questa funzionalità spostata a Build -> ASP.NET Compilation . inserisci qui la descrizione dell'immagine


2
Sai dove si trova questo elemento in Visual Studio 2019?
Protector one

4
@ protector-one Build -> ASP.NET Compilation
Vertigo

1
Ho aperto un vecchio progetto di sito Web basato su cartelle in VS2019 e dovevo File> Salva il progetto prima che questa opzione venisse visualizzata.
Corgalore

15

Ho installato DotNetCompilerPlatform come suggerito da @jbtule, ma ricevevo ancora gli stessi errori.

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

Ho chiuso la soluzione, eliminato le cartelle bin e obj, quindi ho aperto la soluzione e l'ho ricostruita. Ora le funzionalità di C # 6 funzionano.


3
La sola chiusura e riapertura di VS ha funzionato per me (dopo Install-Package ...). Anche il targeting 4.6.
rwalter

1
questo ha funzionato per me, inoltre ho notato che l'uso di resharper potrebbe mostrare falsi errori, mi ci è voluto un po 'per capire perché ottengo "Impossibile risolvere il simbolo" in tutta la vista ...
Niklas

1
Nel mio caso ho solo dovuto aspettare circa 30 secondi dopo aver riaperto la soluzione e ha funzionato senza dover cancellare bine obj.
Marc 2377

12

Possibili soluzioni, tratte dai commenti al post sul blog di ScottGu (cercare "8026" nella pagina):

Suggerimento di soluzione 1 (David Taylor)

Aggiungi questi elementi dom codice RTM a 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>

Quindi aggiungi Roslyn e Microsoft.CodeDom.Providers. *. Dll nella tua directory BIN.

È abbastanza facile da configurare, ma mi è sembrato strano che il modello predefinito non fosse impostato se si seleziona .NET 4.6 durante la creazione di un nuovo "sito Web" in VS 2015 RTM.

Suggerimento di soluzione 2 (Martin)

In seguito al commento di David Taylor sopra, sembra che le impostazioni di system.codedom siano corrette quando un'app Web viene creata con TargetFramework come v4.5.2 predefinito. La modifica di TargetFramework in v4.6 sembra modificare le impostazioni del compilatore per CSharp, in un modo che causa un problema.

La mia soluzione alternativa era la seguente:

  1. File / Nuovo / Applicazione Web ASP.NET
  2. Selezionare il modello "API Web" da modelli ASP.NET 4.5.2
  3. Prendi una copia dell'elemento system.codedom (e dei suoi contenuti) in web.config
  4. Utilizzando Properties / TargetFramework, impostare il Framework di destinazione su 4.6
  5. Sostituisci l'elemento system.codedom modificato in web.config con la copia presa prima di modificare TargetFramework
  6. Colpire F5

La home page dovrebbe caricarsi come previsto.

Per informazioni, il contenuto di system.codedom subito dopo aver modificato TargetFramework in v4.6. era il seguente (notare l'uso del tipo "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>

3
Per quanto riguarda la soluzione 2, la Microsoft.CSharp.CSharpCodeProviderversione 4.0 significa che non sta usando Rosyln, quindi non funzionerà per C # 6.0.
jbtule

1
Quando esegui la migrazione da una soluzione precedente, assicurati che <LangVersion>il csprojfile sia uguale a 6. Può causare problemi se è qualcos'altro.
Saul

7

Questo non è per un progetto di sito Web . Ecco come lo fai per un progetto ASP.NET MVC.

È possibile attivare o disattivare C # 6 nell'interfaccia utente di Visual Studio. Questa è un'opzione così facile, vale la pena provare prima.

  1. Fare clic con il pulsante destro del mouse sul progetto e selezionare Proprietà .
  2. Fare clic sulla scheda Build .
  3. La scheda di costruzione ha un pulsante Avanzate ... in fondo.
  4. Questo apre le impostazioni di build avanzate come mostrato di seguito. Seleziona C # 6.0.

inserisci qui la descrizione dell'immagine


@Manuzor potresti avere ragione. Questo era per un progetto ASP.NET MVC.
Jess

@ Ucho cosa c'è che non va? È un progetto MVC? Hai l'opzione Avanzate nelle impostazioni di costruzione? Mancano le opzioni per la versione in linguaggio C #? Hai impostato la versione e non sei in grado di utilizzare le funzionalità della lingua?
Jess

@Jess: Ah, probabilmente sta funzionando. Non ho notato che il mio errore proviene da IntelliSense e non da build.
Ucho

Questa impostazione non sembra applicarsi al codice nelle pagine aspx, ad es <% Eval(whatever) %>.
Chris,

5

Ecco come appare in VS2017 con un progetto di sito web:

inserisci qui la descrizione dell'immagine


Apprezzo il lavoro di ritaglio @Uwe ma non credo di essere d'accordo con la rimozione del resto del menu di navigazione superiore poiché il contesto è perso per dove dovrebbe essere questa particolare voce di menu.
b_levitt

1
L'ultimo VS 2017 lo ha spostato in 'Build -> ASP.NET Compilation'. Vedi la mia risposta aggiornata.
Vertigo

Per i tipi di progetti di siti web ho testato la risposta di @ b_levitt su VS2019. (1) Assicurati di avere un file web.config. Altrimenti aggiungine uno. (2) Salvare la soluzione selezionandola in Esplora soluzioni e premendo [Ctrl] + [S]. (3) Selezionare il progetto in Esplora soluzioni e modificare il Framework di destinazione in 4.7.2 (4) Selezionare l'opzione "Abilita ultimo C # ..." dal menu Compila> Compilazione ASP.NET.
Denny Jacob il

2

Ho ricevuto questo errore dopo aver apportato ZERO modifiche al mio progetto WebAPI. Ho disinstallato e reinstallato il pacchetto nuget DotNetCompilerPlatform, che ha risolto il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.