Jak używać języka C # 6 z typem projektu witryny sieci Web?

126

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?

Uwe Keim
źródło
1
Czy próbowałeś dodać elementy konfiguracyjne thw, o których wspomniał w komentarzu?
scheien
Mam zamiar to zrobić, ale wygląda bardzo dziwne dla mnie , więc spodziewałem się trochę bardziej czyste rozwiązanie.
Uwe Keim
5
Oczywiście inną opcją jest zaprzestanie używania tych „projektów” witryn sieci Web i zamiast tego używanie projektów aplikacji sieci Web.
John Saunders,
1
@JohnSaunders ja uwielbiam to robić. Ponieważ migracja jest zadaniem ręcznym, obawiam się czasu, jaki zajmie i wszystkich błędów, które wprowadzę podczas migracji. Zrobiłem to kilka razy dla mniejszych projektów. Zawsze był kłopot ...
Uwe Keim
1
Cieszę się, że to rozważyłeś. Komentarz skierowany był głównie do innych czytelników, którzy mogliby pomyśleć, że projekt „strony internetowej” brzmi tak, jak chcą.
John Saunders,

Odpowiedzi:

118

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

Zastępcy dostawcy CodeDOM, którzy używają nowego kompilatora .NET Compiler Platform („Roslyn”) jako usług API. Zapewnia to obsługę nowych funkcji językowych w systemach korzystających z CodeDOM (np. Kompilacja środowiska uruchomieniowego ASP.NET), a także poprawia wydajność kompilacji tych systemów.

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

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.

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

Jeśli nadal go brakuje. Spróbuj dodać siebie.

jbtule
źródło
1
Działa to zgodnie z oczekiwaniami. C # 6 jest już dostępny. Wadą jest to, że moje App_GlobalResources / Resources.resx nie generują już automatycznej klasy, aby uzyskać dostęp do zasobów z silnym typem.
Uwe Keim
1
Uwaga: mogłem budować bez błędów po zmianie celu projektu na 4.6. Jednak musiałem zainstalować ten pakiet, aby rozwiązać problem z czerwonymi zawijasami pojawiającymi się z Intellisense.
Doug Morrow
7
Używam tego w WebForms WebSite (bez pliku projektu). Niestety, proste zmiany .aspx powodują boleśnie wolniejszą ponowną kompilację podczas ponownego żądania strony w przeglądarce. Może Roslyn jest teoretycznie szybszy dla aplikacji sieciowej (z plikiem proj), ale w przypadku witryn internetowych wydaje się być znacznie wolniejszy dzięki csc w folderze App_Code ... Czy ktoś widzi to samo?
Stefan Anghel,
4
Uwaga: aby WebForms skompilował się z C # 6, musisz zainstalować pakiety NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatformi jego zależnośćMicrosoft.Net.Compilers
3
Zauważ, że jeśli masz więcej niż jedną witrynę internetową w swoim rozwiązaniu - rzeczy nie będą działać, najłatwiejszym sposobem odtworzenia jest utworzenie pustego rozwiązania i rozpoczęcie dodawania do niego projektów, po drugiej stronie - zaczniesz otrzymywać komunikat „nie można znaleźć csc.exe” błędy
mac
67

Zobacz też ten wpis na blogu z Sayed Ibrahim Hashimi , w jaki sposób to zrobić za pośrednictwem VS IDE.

W Visual Studio 2015 Update 1 dodaliśmy nową funkcję, aby to uprościć. Gdy masz otwarte rozwiązanie, które ma co najmniej jeden projekt sieci Web, który jest przeznaczony dla platformy .NET 4.5+ i nie ma pakietu DotNetCompilerPlatform NuGet w menu Projekt, pojawi się nowa opcja, Włącz C # 6 / VB 14.
wprowadź opis obrazu tutaj

Aktualizacja.

VS 2017 i 2019 mają tę funkcję przeniesioną do kompilacji -> kompilacja ASP.NET . wprowadź opis obrazu tutaj

Zawrót głowy
źródło
2
Czy wiesz, gdzie znajduje się ten element w programie Visual Studio 2019?
Protector One
4
@ protector-one Kompilacja -> Kompilacja ASP.NET
Vertigo
1
Otworzyłem starszy projekt witryny sieci Web oparty na folderach w VS2019 i musiałem wybrać Plik> Zapisz projekt, zanim ta opcja się pojawiła.
Corgalore
15

Zainstalowałem DotNetCompilerPlatform zgodnie z sugestią @jbtule, ale nadal otrzymywałem te same błędy.

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

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

Jon Crowell
źródło
3
Samo zamknięcie i ponowne otwarcie VS zadziałało (po Install-Package ...). Również ukierunkowany na 4.6.
rwalter
1
to zadziałało dla mnie, zauważ również, że użycie resharper może pokazać fałszywe błędy, zajęło mi trochę czasu, zanim zrozumiałem, dlaczego widzę „Unable to resolution symbol” w całym widoku ...
Niklas
1
W moim przypadku musiałem tylko poczekać około 30 sekund po ponownym otwarciu rozwiązania i zadziałało bez konieczności usuwania bini obj.
Marc.2377 Kwietnia
12

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:

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

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:

  1. Plik / Nowy / Aplikacja sieciowa ASP.NET
  2. Wybierz szablon „Web API” z szablonów ASP.NET 4.5.2
  3. Zrób kopię elementu system.codedom (i jego zawartości) w web.config
  4. Używając Properties / TargetFramework, ustaw platformę docelową na 4,6
  5. Zastąp zmodyfikowany element system.codedom w web.config kopią wykonaną przed zmianą TargetFramework
  6. Trafienie F5

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”):

<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
źródło
3
Jeśli chodzi o Twoje rozwiązanie 2, Microsoft.CSharp.CSharpCodeProviderwersja 4.0 oznacza, że ​​nie używa Rosyln, więc nie będzie działać dla C # 6.0.
jbtule
1
Podczas migracji ze starszego rozwiązania upewnij się, że <LangVersion>w csprojpliku jest równa 6. Może powodować problemy, jeśli jest czymś innym.
Saul
7

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

  1. Kliknij prawym przyciskiem myszy projekt i wybierz opcję Właściwości .
  2. Kliknij kartę Konstruuj .
  3. Na samym dole na karcie kompilacji znajduje się przycisk Zaawansowane ...
  4. Otworzy się zaawansowane ustawienia kompilacji, jak pokazano poniżej. Wybierz C # 6.0.

wprowadź opis obrazu tutaj

Pęto
źródło
@Manuzor możesz mieć rację. To było dla projektu ASP.NET MVC.
Jess,
@Ucho, co się stało? Czy to projekt MVC? Czy masz opcję Zaawansowane w ustawieniach kompilacji? Brakuje Ci opcji dla wersji językowej C #? Czy ustawiłeś wersję i nie możesz korzystać z funkcji językowych?
Jess,
@Jess: Ach, prawdopodobnie działa. Nie zauważyłem, że mój błąd pochodzi z IntelliSense, a nie z kompilacji.
Ucho
Wydaje się, że to ustawienie nie ma zastosowania do kodu na stronach aspx, np <% Eval(whatever) %>.
Chris
5

Oto jak to wygląda w VS2017 z projektem strony internetowej:

wprowadź opis obrazu tutaj

b_levitt
źródło
Doceniam zadanie przycinania @Uwe, ale nie sądzę, żebym zgadzał się z usunięciem reszty górnej nawigacji, ponieważ utracono kontekst, w którym powinien znajdować się ten konkretny element menu.
b_levitt
1
Najnowsza wersja VS 2017 przeniosła to do „Kompilacja -> Kompilacja ASP.NET”. Zobacz moją zaktualizowaną odpowiedź.
Vertigo
Dla typów projektów witryn internetowych przetestowałem odpowiedź @ b_levitt na VS2019. (1) Upewnij się, że masz plik web.config. Jeśli nie, dodaj jeden. (2) Zapisz rozwiązanie, wybierając je w Eksploratorze rozwiązań i naciskając klawisze [Ctrl] + [S]. (3) Wybierz projekt w Eksploratorze rozwiązań i zmień platformę docelową na 4.7.2 (4) Wybierz opcję „Włącz najnowsze C # ...” z menu Kompilacja> Kompilacja ASP.NET.
Denny Jacob
2

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.

Wejdź
źródło