Wie verwende ich C # 6 mit dem Website-Projekttyp?

126

Ich habe einen vorhandenen Website- Projekttyp Visual Studio 2015 aktualisiert und das Framework auf 4.6 geändert.

Ich habe dann erwartet, dass all diese neuen Funktionen in meinem Code hinter Dateien verfügbar sind.

Leider bekomme ich Fehler wie:

Fehler CS8026: Die Funktion 'Eigenschaft mit Ausdruckskörper' ist in C # 5 nicht verfügbar. Bitte verwenden Sie die Sprachversion 6 oder höher.

oder zB:

Fehler CS8026: Die Funktion 'Interpolierte Zeichenfolgen' ist in C # 5 nicht verfügbar. Bitte verwenden Sie die Sprachversion 6 oder höher.

Ich habe einen kurzen Google-Check durchgeführt und einen Typen gefunden, der einige Kommentare in einem Blog-Beitrag von ScottGu veröffentlicht hat (Suche nach "8026" auf der Seite).

Da ich seine Lösung nicht verstehe und die Lösung besser sichtbar machen möchte, habe ich dieses SO-Posting erstellt.

Meine Frage:

Wie kann ich ein Visual Studio 2015-Projekt vom Typ Website (dh keine Webanwendung ) verwenden, um C # 6-Funktionen zu erkennen?

Uwe Keim
quelle
1
Haben Sie versucht, die Konfigurationselemente hinzuzufügen, die er im Kommentar erwähnt hat?
Scheien
Ich bin dabei, das zu tun, aber es sieht für mich wirklich seltsam aus , also hatte ich eine sauberere Lösung erwartet.
Uwe Keim
5
Die andere Möglichkeit besteht natürlich darin, die Verwendung dieser Website- "Projekte" zu beenden und stattdessen Webanwendungsprojekte zu verwenden.
John Saunders
1
@JohnSaunders Ich würde lieben , das zu tun. Da die Migration eine manuelle Aufgabe ist, befürchte ich die Zeit und alle Fehler, die ich während der Migration einführen werde. Habe es ein paar Mal für kleinere Projekte gemacht. War immer ein Ärger ...
Uwe Keim
1
Ich bin froh, dass du darüber nachgedacht hast. Der Kommentar war hauptsächlich für andere Leser gedacht, die vielleicht denken, dass ein "Website" -Projekt so klingt, wie sie es wollen.
John Saunders

Antworten:

118

Ich habe dies mit ASP.NET MVC 5 (getestet 5.2.3) getestet, und Ihr Kilometerstand kann mit anderen Webframeworks variieren, aber Sie müssen nur das Roslyn CodeDOM | hinzufügen NuGet- Paket

CodeDOM-Anbieter für .NET Compiler ...

Ersatz-CodeDOM-Anbieter, die den neuen .NET Compiler Platform-Compiler ("Roslyn") als Service-APIs verwenden. Dies bietet Unterstützung für neue Sprachfunktionen in Systemen, die CodeDOM verwenden (z. B. ASP.NET-Laufzeitkompilierung), sowie eine Verbesserung der Kompilierungsleistung dieser Systeme.

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

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

Das NuGet-Paket sollte die DLL-Dateien hinzufügen und Folgendes zu Ihrer web.config hinzufügen.

  <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>

Wenn es noch fehlt. Versuchen Sie, sich selbst hinzuzufügen.

jbtule
quelle
1
Dies funktioniert wie erwartet. C # 6 jetzt verfügbar. Nachteil ist, dass meine App_GlobalResources / Resources.resx nicht mehr die Auto-Klasse für den stark typisierten Zugriff auf die Ressourcen generiert.
Uwe Keim
1
Als Hinweis konnte ich fehlerfrei erstellen, nachdem das Projektziel auf 4.6 geändert wurde. Ich musste dieses Paket jedoch installieren, um rote Kringel zu beheben, die von Intellisense angezeigt werden.
Doug Morrow
7
Ich verwende dies in einer WebForms-Website (keine Projektdatei). Leider lösen einfache ASPX-Änderungen eine schmerzhaft langsamere Neukompilierung aus, wenn die Seite in einem Browser erneut angefordert wird. Vielleicht ist Roslyn für eine WebApplication (mit proj-Datei) theoretisch schneller, aber für WebSites scheint es über csc im App_Code-Ordner erheblich langsamer zu sein ... Hat jemand dasselbe gesehen?
Stefan Anghel
4
Hinweis: Damit WebForms mit C # 6 kompiliert werden kann, müssen Sie NuGet-Pakete Microsoft.CodeDom.Providers.DotNetCompilerPlatformund ihre Abhängigkeit installierenMicrosoft.Net.Compilers
3
Beachten Sie, dass wenn Sie mehr als eine Website in Ihrer Lösung haben - Dinge, die nicht funktionieren, der einfachste Weg zum Reproduzieren darin besteht, eine leere Lösung zu erstellen und Projekte hinzuzufügen, nach der zweiten Website - Sie erhalten "csc.exe kann nicht gefunden werden". Fehler
Mac
67

Siehe auch diesen Blog-Beitrag von Sayed Ibrahim Hashimi, wie dies über die VS-IDE erfolgt.

In Visual Studio 2015 Update 1 haben wir eine neue Funktion aufgenommen, um dies zu vereinfachen. Wenn Sie eine Lösung geöffnet haben, die mindestens ein Webprojekt enthält, das auf .NET 4.5+ abzielt und nicht über das DotNetCompilerPlatform NuGet-Paket im Menü Projekt verfügt, wird die neue Option Enable C # 6 / VB 14 angezeigt.
Geben Sie hier die Bildbeschreibung ein

Aktualisieren.

Bei VS 2017 und 2019 wurde diese Funktion auf Build -> ASP.NET Compilation verschoben . Geben Sie hier die Bildbeschreibung ein

Schwindel
quelle
2
Wissen Sie, wo sich dieses Element in Visual Studio 2019 befindet?
Beschützer ein
4
@ Protector-One Build -> ASP.NET-Kompilierung
Vertigo
1
Ich habe ein älteres ordnerbasiertes Website-Projekt in VS2019 geöffnet und musste Datei> Projekt speichern, bevor diese Option angezeigt wurde.
Corgalore
15

Ich habe die DotNetCompilerPlatform wie von @jbtule vorgeschlagen installiert, bekam aber immer noch die gleichen Fehler.

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

Ich habe die Lösung geschlossen, die Ordner bin und obj gelöscht, dann die Lösung geöffnet und neu erstellt. Jetzt funktionieren die C # 6-Funktionen.

Jon Crowell
quelle
3
Nur das Schließen und Wiedereröffnen von VS hat für mich (nach Install-Package ...) funktioniert . Auch auf 4.6 abzielen.
Rwalter
1
Dies funktionierte für mich. Beachten Sie auch, dass die Verwendung von Resharper möglicherweise falsche Fehler anzeigt. Ich habe eine Weile gebraucht, um herauszufinden, warum in der gesamten Ansicht "Symbol kann nicht aufgelöst werden"
Niklas
1
In meinem Fall hatte ich etwa 30 Sekunden nur warten , nachdem die Lösung der Wiedereröffnung und es funktionierte ohne löschen zu müssen binund obj.
März 2377
12

Mögliche Lösungen, entnommen aus den Kommentaren zu ScottGus Blogposting (Suche nach "8026" auf der Seite):

Lösungsvorschlag 1 (David Taylor)

Fügen Sie diese RTM-Code-Dom-Elemente zu web.config hinzu:

<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>

Fügen Sie dann die Dateien Roslyn und Microsoft.CodeDom.Providers. *. DLL in Ihr BIN-Verzeichnis ein.

Die Einrichtung ist einfach genug, aber mir war nur seltsam, dass die Standardvorlage nicht dafür eingerichtet wurde, wenn Sie beim Erstellen einer neuen "Website" in VS 2015 RTM .NET 4.6 ausgewählt haben.

Lösungsvorschlag 2 (Martin)

Nach dem obigen Kommentar von David Taylor sieht es so aus, als ob die Einstellungen für system.codedom korrekt sind, wenn eine Webanwendung mit TargetFramework als Standard v4.5.2 erstellt wird. Durch Ändern von TargetFramework in Version 4.6 werden die Compilereinstellungen für CSharp anscheinend so geändert, dass ein Problem auftritt.

Meine Problemumgehungen waren wie folgt:

  1. Datei / Neu / ASP.NET-Webanwendung
  2. Wählen Sie die Vorlage "Web API" aus ASP.NET 4.5.2 Templates
  3. Erstellen Sie eine Kopie des system.codedom-Elements (und seines Inhalts) in web.config
  4. Setzen Sie mit Properties / TargetFramework das Target Framework auf 4.6
  5. Ersetzen Sie das geänderte system.codedom-Element in web.config durch die Kopie, die vor dem Ändern von TargetFramework erstellt wurde
  6. Schlagen F5

Die Startseite sollte wie erwartet geladen werden.

Zur Information: Der Inhalt von system.codedom wird unmittelbar nach dem Ändern von TargetFramework in Version 4.6 angezeigt. war wie folgt (beachten Sie die Verwendung des Typs "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
quelle
3
In Bezug auf Ihre Lösung 2 Microsoft.CSharp.CSharpCodeProviderbedeutet Version 4.0, dass Rosyln nicht verwendet wird. Daher funktioniert dies nicht für C # 6.0.
Jbtule
1
Stellen Sie bei der Migration von einer älteren Lösung sicher, dass <LangVersion>die csprojDatei gleich ist 6. Es kann Probleme verursachen, wenn es etwas anderes ist.
Saul
7

Dies ist nicht für ein Website-Projekt . So machen Sie es für ein ASP.NET MVC-Projekt.

Sie können C # 6 in der Visual Studio-Benutzeroberfläche umschalten. Dies ist eine so einfache Option, dass es sich lohnt, sie zuerst auszuprobieren.

  1. Klicken Sie mit der rechten Maustaste auf Ihr Projekt und wählen Sie Eigenschaften .
  2. Klicken Sie auf die Registerkarte Erstellen .
  3. Auf der Registerkarte "Erstellen" befindet sich ganz unten die Schaltfläche " Erweitert" .
  4. Dies öffnet die erweiterten Build-Einstellungen wie unten gezeigt. Wählen Sie C # 6.0.

Geben Sie hier die Bildbeschreibung ein

Jess
quelle
@ Manuzor Sie könnten Recht haben. Dies war für ein ASP.NET MVC-Projekt.
Jess
@Ucho was ist los? Ist es ein MVC-Projekt? Haben Sie die Option Erweitert in den Build-Einstellungen? Fehlen Ihnen Optionen für die C # -Sprachenversion? Haben Sie die Version festgelegt und können keine Sprachfunktionen verwenden?
Jess
@ Jess: Ah, arbeitet wahrscheinlich. Ich habe nicht bemerkt, dass mein Fehler von IntelliSense stammt, nicht von Build.
Ucho
Diese Einstellung scheint nicht für Code auf Aspx-Seiten zu gelten, z <% Eval(whatever) %>.
Chris
5

So sieht es in VS2017 mit einem Website-Projekt aus:

Geben Sie hier die Bildbeschreibung ein

b_levitt
quelle
Ich schätze den Zuschneidejob @Uwe, aber ich glaube nicht, dass ich damit einverstanden bin, den Rest des oberen Navigationsgeräts zu entfernen, da der Kontext für diesen bestimmten Menüpunkt verloren geht.
b_levitt
1
Das neueste VS 2017 hat dies auf "Erstellen -> ASP.NET-Kompilierung" verschoben. Siehe meine aktualisierte Antwort.
Schwindel
Für Website-Projekttypen habe ich die Antwort von @ b_levitt auf VS2019 getestet. (1) Stellen Sie sicher, dass Sie eine web.config haben. Wenn nicht, fügen Sie eine hinzu. (2) Speichern Sie die Lösung, indem Sie sie im Projektmappen-Explorer auswählen und [Strg] + [S] eingeben. (3) Wählen Sie das Projekt im Projektmappen-Explorer aus und ändern Sie das Ziel-Framework in 4.7.2. (4) Wählen Sie im Menü Erstellen> ASP.NET-Kompilierung die Option "Letzte C # aktivieren ...".
Denny Jacob
2

Ich habe diesen Fehler erhalten, nachdem ich NULL Änderungen an meinem WebAPI-Projekt vorgenommen habe. Ich habe das DotNetCompilerPlatform-Nuget-Paket deinstalliert und neu installiert, wodurch das Problem behoben wurde.

Komm herein
quelle