Zaktualizowałem istniejący typ projektu witryny sieci Web Visual Studio 2015, zmieniłem Framework na 4.6.
Spodziewałem się wtedy, że wszystkie te nowe funkcje będą dostępne w moim kodzie za plikami.
Niestety otrzymuję błędy takie jak:
Błąd CS8026: Funkcja „Właściwość treści wyrażenia” nie jest dostępna w języku C # 5. Użyj wersji językowej 6 lub nowszej.
lub np .:
Błąd CS8026: Funkcja „interpolowane ciągi znaków” nie jest dostępna w języku C # 5. Użyj wersji językowej 6 lub nowszej.
Zrobiłem szybkie sprawdzenie w Google i znalazłem faceta publikującego kilka komentarzy w poście na blogu ScottGu (wyszukaj „8026” na stronie).
Ponieważ nie rozumiem jego rozwiązania, a ponadto chcę, aby rozwiązanie było bardziej widoczne, utworzyłem ten wpis SO.
Moje pytanie:
Jak mogę mieć projekt Visual Studio 2015 typu Witryna sieci Web (tj. Nie aplikacja sieci Web ), aby rozpoznawać funkcje C # 6?
źródło
Odpowiedzi:
Przetestowałem to z ASP.NET MVC 5 (testowane 5.2.3), a Twój przebieg może się różnić w przypadku innych platform internetowych, ale wystarczy dodać Roslyn CodeDOM | Pakiet NuGet
Dostawcy CodeDOM dla kompilatora .NET ...
https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/
Pakiet NuGet powinien dodać pliki DLL i dodać następujące elementy do pliku web.config.
Jeśli nadal go brakuje. Spróbuj dodać siebie.
źródło
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
i jego zależnośćMicrosoft.Net.Compilers
Zobacz też ten wpis na blogu z Sayed Ibrahim Hashimi , w jaki sposób to zrobić za pośrednictwem VS IDE.
Aktualizacja.
VS 2017 i 2019 mają tę funkcję przeniesioną do kompilacji -> kompilacja ASP.NET .
źródło
Zainstalowałem DotNetCompilerPlatform zgodnie z sugestią @jbtule, ale nadal otrzymywałem te same błędy.
Zamknąłem rozwiązanie, usunąłem foldery bin i obj, a następnie otworzyłem rozwiązanie i odbudowałem. Teraz funkcje C # 6 działają.
źródło
Install-Package ...
). Również ukierunkowany na 4.6.bin
iobj
.Możliwe rozwiązania zaczerpnięte z komentarzy na blogu ScottGu (wyszukaj „8026” na stronie):
Propozycja rozwiązania 1 (David Taylor)
Dodaj te elementy RTM code dom do web.config:
Następnie dodaj pliki Roslyn i Microsoft.CodeDom.Providers. *. Dll do swojego katalogu BIN.
Jest to dość łatwe do skonfigurowania, ale było dla mnie dziwne, że domyślny szablon nie został skonfigurowany dla niego, jeśli wybrano .NET 4.6 podczas tworzenia nowej „witryny sieci Web” w VS 2015 RTM.
Propozycja rozwiązania 2 (Martin)
W nawiązaniu do powyższego komentarza Davida Taylora, wygląda na to, że ustawienia system.codedom są poprawne, gdy tworzona jest aplikacja internetowa z TargetFramework jako domyślną wersją 4.5.2. Zmiana TargetFramework na v4.6 wydaje się modyfikować ustawienia kompilatora dla CSharp w sposób, który powoduje problem.
Moje obejścia były następujące:
Strona główna powinna załadować się zgodnie z oczekiwaniami.
Dla informacji, zawartość system.codedom natychmiast po zmianie TargetFramework na v4.6. wyglądało następująco (zwróć uwagę na użycie typu „Microsoft.CSharp.CSharpCodeProvider”):
źródło
Microsoft.CSharp.CSharpCodeProvider
wersja 4.0 oznacza, że nie używa Rosyln, więc nie będzie działać dla C # 6.0.<LangVersion>
wcsproj
pliku jest równa6
. Może powodować problemy, jeśli jest czymś innym.To nie jest dla projektu witryny sieci Web . Oto jak to zrobić w przypadku projektu ASP.NET MVC.
Możesz przełączać C # 6 w interfejsie użytkownika programu Visual Studio. To taka łatwa opcja, warto najpierw spróbować.
źródło
<% Eval(whatever) %>
.Oto jak to wygląda w VS2017 z projektem strony internetowej:
źródło
Otrzymałem ten błąd po wprowadzeniu ZERO zmian w moim projekcie WebAPI. Odinstalowałem pakiet NuGet DotNetCompilerPlatform i ponownie zainstalowałem, co rozwiązało problem.
źródło