Web Sitesi proje türü ile C # 6 nasıl kullanılır?


126

Var olan bir Web Sitesi proje türü Visual Studio 2015 güncellendi, Çerçeveyi 4.6 olarak değiştirdim.

Daha sonra tüm bu yeni özelliklerin dosyaların arkasındaki kodumda mevcut olmasını bekliyordum.

Maalesef aşağıdaki gibi hatalar alıyorum:

Hata CS8026: 'ifade gövdeli özelliği' özelliği C # 5'te kullanılamıyor. Lütfen dil sürümü 6 veya üzerini kullanın.

veya örneğin:

Hata CS8026: 'Enterpolasyonlu dizeler' özelliği C # 5'te kullanılamaz. Lütfen dil sürümü 6 veya üzerini kullanın.

Hızlı bir Google kontrolü yaptım ve ScottGu'nun bir blog yayınına bazı yorumlar gönderen bir adam buldum (sayfada "8026" araması yapın).

Çözümünü anlamadığım ve çözümün daha görünür olmasını istediğim için, bu SO yazısını oluşturdum.

Benim sorum:

C # 6 özelliklerini tanımak için Web Sitesi (yani Web Uygulaması değil ) türünde bir Visual Studio 2015 projesine nasıl sahip olabilirim ?


1
Yorumda bahsettiği thw yapılandırma öğelerini eklemeyi denediniz mi?
scheien

Bunu yapmak üzereyim, ama bana gerçekten garip geliyor , bu yüzden daha temiz bir çözüm bekliyordum.
Uwe Keim

5
Elbette, diğer seçenek de bu web sitesi "projelerini" kullanmayı bırakmak ve bunun yerine Web Uygulama Projeleri kullanmaktır.
John Saunders

1
Ben ediyorum @JohnSaunders seviyorum bunu. Geçiş manuel bir görev olduğu için, zaman alacağından ve taşıma sırasında yapacağım tüm hatalardan korkuyorum. Daha küçük projeler için birkaç kez yaptım. Her zaman bir güçlük oldu ...
Uwe Keim

1
Bunu düşündüğüne sevindim. Yorum çoğunlukla bir "web sitesi" projesinin istedikleri gibi göründüğünü düşünebilecek diğer okuyucular içindi.
John Saunders

Yanıtlar:


118

Bunu ASP.NET MVC 5 (test 5.2.3) ile test ettim ve kilometreniz diğer web çerçevelerine göre değişebilir, ancak yalnızca Roslyn CodeDOM | NuGet paketi

.NET Derleyicisi için CodeDOM Sağlayıcıları ...

Hizmet API'leri olarak yeni .NET Derleyici Platformu ("Roslyn") derleyicisini kullanan yedek CodeDOM sağlayıcıları. Bu, CodeDOM kullanan sistemlerde yeni dil özellikleri için destek sağlar (örn. ASP.NET çalışma zamanı derlemesi) ve bu sistemlerin derleme performansını iyileştirir.

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

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

NuGet paketi DLL dosyalarını eklemeli ve web.config dosyanıza aşağıdakileri eklemelidir.

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

Hala eksikse. Kendinizi eklemeyi deneyin.


1
Bu beklendiği gibi çalışıyor. C # 6 artık kullanılabilir. Dezavantajı, App_GlobalResources / Resources.resx'imin artık kaynaklara kesin olarak yazılmış erişim için otomatik sınıf oluşturmamasıdır.
Uwe Keim

1
Not olarak, proje hedefi 4.6 olarak değiştirildikten sonra hatasız bir şekilde inşa edebildim. Ancak, intellisense'den görünen kırmızı dalgalı çizgileri çözmek için bu paketi yüklemem gerekiyordu.
Doug Morrow

7
Bunu bir WebForms Web Sitesinde kullanıyorum (proje dosyası yok). Ne yazık ki, basit .aspx değişiklikleri, bir tarayıcıda sayfayı yeniden talep ederken son derece yavaş bir yeniden derlemeyi tetikler. Belki Roslyn bir WebApplication için teorik olarak daha hızlıdır (proj dosyası ile), ancak Web Siteleri için App_Code klasöründeki csc aracılığıyla önemli ölçüde daha yavaş görünüyor ... Aynı şeyi gören var mı?
Stefan Anghel

4
Not, WebForms'un C # 6 ile derlenmesi için Microsoft.CodeDom.Providers.DotNetCompilerPlatformMicrosoft.Net.Compilers

3
Çözümünüzde birden fazla web siteniz varsa - işler işe yaramazsa, yeniden üretmenin en kolay yolu boş bir çözüm oluşturmak ve buna projeler eklemeye başlamaktır, ikinci web sitesinden sonra "csc.exe bulunamıyor" almaya başlayacaksınız. hatalar
mac

67

Ayrıca bkz bu blog yazısı dan Sayed İbrahim Haşimi VS IDE ile bu nasıl yapılacağına ilişkin.

Visual Studio 2015 Güncelleştirme 1'de bunu basitleştirmek için yeni bir özellik ekledik. NET 4.5+ hedefleyen en az bir web projesine sahip olan ve Proje menüsünde DotNetCompilerPlatform NuGet paketine sahip olmayan bir çözümünüz açık olduğunda, yeni bir seçenek göreceksiniz, Enable C # 6 / VB 14 görünür.
görüntü açıklamasını buraya girin

Güncelleme.

VS 2017 ve 2019'da bu özellik Build -> ASP.NET Compilation'a taşınmıştır . görüntü açıklamasını buraya girin


2
Bu öğenin Visual Studio 2019'da nerede olduğunu biliyor musunuz?
Bir

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

1
VS2019'da daha eski bir klasör tabanlı web sitesi projesi açtım ve bu seçeneğin görünmesi için Dosya> Projeyi kaydetmem gerekiyordu.
Corgalore

15

DotNetCompilerPlatform'u @jbtule'un önerdiği gibi kurdum, ancak yine de aynı hataları alıyordum.

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

Çözümü kapattım, bin ve obj klasörlerini sildim, sonra çözümü açıp yeniden oluşturdum. Şimdi C # 6 özellikleri çalışıyor.


3
Sadece VS'yi kapatmak ve yeniden açmak benim için çalıştı (sonra Install-Package ...). Ayrıca 4.6'yı hedefliyor.
rwalter

1
bu benim için çalıştı, ayrıca yeniden paylaşım kullanmanın yanlış hatalar gösterebileceğini de fark ettim, tüm görünümde neden "Sembol çözülemiyor" mesajı aldığımı anlamam biraz zaman aldı ...
Niklas

1
Benim durumumda, çözümü yeniden açtıktan sonra yaklaşık 30 saniye beklemek zorunda kaldım ve silmek zorunda kalmadan çalıştı binve obj.
Marc. 2377

12

ScottGu'nun blog gönderisindeki yorumlardan alınan olası çözümler (sayfada "8026" araması yapın):

Çözüm önerisi 1 (David Taylor)

Bu RTM kodu dom öğelerini web.config dosyasına ekleyin:

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

Ardından Roslyn ve Microsoft.CodeDom.Providers. *. Dll öğelerini BIN dizininize ekleyin.

Kurulumu yeterince kolay, ancak VS 2015 RTM'de yeni bir "Web Sitesi" oluştururken .NET 4.6'yı seçtiyseniz varsayılan şablonun bunun için ayarlanmaması bana garip geldi.

Çözüm önerisi 2 (Martin)

David Taylor'ın yukarıdaki yorumuna ek olarak, varsayılan v4.5.2 olarak TargetFramework ile bir Web Uygulaması oluşturulduğunda system.codedom ayarları doğru görünüyor. TargetFramework'ü v4.6 olarak değiştirmek, CSharp için derleyici ayarlarını bir soruna neden olacak şekilde değiştiriyor gibi görünüyor.

Çözümlerim aşağıdaki gibiydi:

  1. Dosya / Yeni / ASP.NET Web Uygulaması
  2. ASP.NET 4.5.2 Şablonlarından "Web API" şablonunu seçin
  3. System.codedom öğesinin (ve içeriğinin) web.config dosyasındaki bir kopyasını alın
  4. Properties / TargetFramework kullanarak Hedef Çerçeveyi 4.6 olarak ayarlayın
  5. Web.config'deki değiştirilmiş system.codedom öğesini TargetFramework değiştirmeden önce alınan kopya ile değiştirin
  6. hit F5

Ana Sayfa beklendiği gibi yüklenmelidir.

Bilgi için, TargetFramework v4.6 olarak değiştirildikten hemen sonra system.codedom içeriği. aşağıdaki gibiydi ("Microsoft.CSharp.CSharpCodeProvider" Türü kullanımına dikkat edin):

<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
Çözüm Microsoft.CSharp.CSharpCodeProvider2'nizle ilgili olarak, sürüm 4.0, Rosyln kullanmadığı anlamına gelir, Bu nedenle C # 6.0 için çalışmaz.
jbtule

1
Eski bir çözümden geçiş yaparken <LangVersion>,csproj dosyanın eşit6 . Başka bir şey olursa sorunlara neden olabilir.
Saul

7

Bu bir Web Sitesi Projesi için değildir . Bir ASP.NET MVC projesi için bunu nasıl yaparsınız.

Visual Studio kullanıcı arayüzünde C # 6'yı açıp kapatabilirsiniz. Bu çok kolay bir seçenek, önce denemeye değer.

  1. Projenize sağ tıklayın ve Özellikler'i seçin .
  2. Click Yapı sekmesini.
  3. Derleme sekmesinin en altında bir Gelişmiş ... düğmesi vardır.
  4. Bu, aşağıda gösterildiği gibi Gelişmiş Yapı Ayarlarını açar . C # 6.0 seçin.

görüntü açıklamasını buraya girin


@Manuzor haklı olabilirsin. Bu bir ASP.NET MVC projesi içindi.
Jess

@Ucho sorun ne? MVC projesi mi? Yapı ayarlarında Gelişmiş seçeneğiniz var mı? C # dil sürümü için seçenekler eksik mi? Sürümü ayarladınız ve dil özelliklerini kullanamadınız mı?
Jess

@Jess: Ah, muhtemelen çalışıyor. Hatamın IntelliSense'ten gelmediğini fark etmedim.
Ucho

Bu ayar, aspx sayfalarındaki kod için geçerli görünmüyor, örneğin <% Eval(whatever) %>.
Chris

5

İşte bir web sitesi projesiyle VS2017'de nasıl göründüğü:

görüntü açıklamasını buraya girin


@Uwe kırpma işini takdir ediyorum, ancak bu belirli menü öğesinin nerede olması gerektiği için içerik kaybolduğundan, üstteki gezinmenin geri kalanını kaldırmayı kabul ettiğimi sanmıyorum.
b_levitt

1
En son VS 2017, bunu 'Build -> ASP.NET Compilation' konumuna taşıdı. Güncellenen cevabıma bakın.
Vertigo

Web sitesi proje türleri için @ b_levitt'in VS2019'daki cevabını test ettim. (1) Bir web.config'iniz olduğundan emin olun. Bir tane eklemiyorsanız. (2) Çözümü Çözüm Gezgini'nde seçip [Ctrl] + [S] vererek kaydedin. (3) Solution Explorer'da projeyi seçin ve Target Framework'ü 4.7.2 olarak değiştirin (4) Build> ASP.NET Compilation menüsünden "En son C # ..." seçeneğini etkinleştirin.
Denny Jacob

2

WebAPI projemde SIFIR değişiklik yaptıktan sonra bu hatayı aldım. DotNetCompilerPlatform nuget paketini kaldırdım ve yeniden yükledim, bu da sorunu çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.