จะใช้ C # 6 กับ Web Site ประเภทโครงการอย่างไร?


126

อัปเดตประเภทโครงการเว็บไซต์ที่มีอยู่Visual Studio 2015 ฉันเปลี่ยนกรอบงานเป็น 4.6

จากนั้นฉันคาดว่าจะมีคุณสมบัติใหม่ทั้งหมดในโค้ดของฉันหลังไฟล์

ขออภัยฉันได้รับข้อผิดพลาดเช่น:

ข้อผิดพลาด CS8026: คุณสมบัติ 'คุณสมบัติการแสดงออก' ไม่มีใน C # 5 โปรดใช้ภาษาเวอร์ชัน 6 ขึ้นไป

หรือเช่น:

ข้อผิดพลาด CS8026: คุณลักษณะ 'สตริงที่ถูกแก้ไข' ไม่มีใน C # 5 โปรดใช้ภาษาเวอร์ชัน 6 ขึ้นไป

ฉันตรวจสอบ Google อย่างรวดเร็วและพบว่ามีผู้ชายคนหนึ่งโพสต์ความคิดเห็นในบล็อกโพสต์ของ ScottGu (ค้นหา "8026" ในหน้านั้น)

เนื่องจากฉันไม่เข้าใจวิธีแก้ปัญหาของเขาบวกกับฉันต้องการให้มองเห็นโซลูชันมากขึ้นฉันจึงได้สร้างโพสต์ SO นี้ขึ้น

คำถามของฉัน:

ฉันจะมีโครงการ Visual Studio 2015 ประเภทเว็บไซต์ (เช่นไม่ใช่Web Application ) เพื่อจดจำคุณลักษณะ C # 6 ได้อย่างไร


1
คุณได้ลองเพิ่มองค์ประกอบ config thw ที่เขาพูดถึงในความคิดเห็นหรือไม่?
แบบแผน

ฉันกำลังจะทำแบบนั้น แต่มันดูแปลกมากสำหรับฉันดังนั้นฉันจึงคาดหวังว่าจะมีวิธีแก้ปัญหาที่สะอาดกว่านี้
Uwe Keim

5
แน่นอนว่าอีกทางเลือกหนึ่งคือหยุดใช้ "โครงการ" ของเว็บไซต์เหล่านั้นและใช้ Web Application Projects แทน
John Saunders

1
@JohnSaunders ฉันชอบที่จะทำอย่างนั้น เนื่องจากการย้ายข้อมูลเป็นงานที่ต้องทำเองฉันจึงกลัวว่าจะต้องใช้เวลานานและข้อผิดพลาดทั้งหมดที่ฉันจะแนะนำในระหว่างการย้ายข้อมูล ทำสองสามครั้งสำหรับโครงการขนาดเล็ก เป็นเรื่องยุ่งยากเสมอ ...
Uwe Keim

1
ดีใจที่คุณพิจารณาแล้ว ความคิดเห็นส่วนใหญ่เป็นของผู้อ่านคนอื่น ๆ ที่อาจคิดว่าโครงการ "เว็บไซต์" ดูเหมือนสิ่งที่พวกเขาต้องการ
John Saunders

คำตอบ:


118

ฉันได้ทดสอบกับ ASP.NET MVC 5 (ทดสอบ 5.2.3) และระยะทางของคุณอาจแตกต่างกันไปตามกรอบงานเว็บอื่น ๆ แต่คุณต้องเพิ่มRoslyn CodeDOM | แพ็คเกจNuGet

ผู้ให้บริการ CodeDOM สำหรับ. NET Compiler ...

ผู้ให้บริการ CodeDOM ทดแทนที่ใช้คอมไพเลอร์. NET Compiler Platform ("Roslyn") ใหม่เป็น API บริการ สิ่งนี้ให้การสนับสนุนสำหรับคุณลักษณะภาษาใหม่ในระบบที่ใช้ CodeDOM (เช่นการคอมไพล์รันไทม์ ASP.NET) รวมทั้งปรับปรุงประสิทธิภาพการคอมไพล์ของระบบเหล่านี้

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

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

แพ็คเกจ NuGet ควรเพิ่มไฟล์ DLL และเพิ่มสิ่งต่อไปนี้ใน 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>

ถ้ายังขาดอยู่. ลองเพิ่มตัวคุณเอง


1
สิ่งนี้ได้ผลตามที่คาดไว้ C # 6 พร้อมใช้งานแล้ว ข้อเสียเปรียบคือApp_GlobalResources / Resources.resxของฉันไม่สร้างคลาสอัตโนมัติเพื่อเข้าถึงทรัพยากรที่พิมพ์ผิดอีกต่อไป
Uwe Keim

1
โปรดทราบว่าฉันสามารถสร้างได้โดยไม่มีข้อผิดพลาดหลังจากเปลี่ยนเป้าหมายโครงการเป็น 4.6 อย่างไรก็ตามฉันจำเป็นต้องติดตั้งแพ็คเกจนี้เพื่อแก้ไขปัญหา squigglies สีแดงที่แสดงขึ้นจาก intellisense
Doug Morrow

7
ฉันใช้สิ่งนี้ใน WebForms WebSite (ไม่มีไฟล์โครงการ) น่าเศร้าที่การเปลี่ยนแปลง. aspx แบบธรรมดาทำให้เกิดการคอมไพล์ใหม่ช้าลงอย่างเจ็บปวดเมื่อขอหน้าใหม่ในเบราว์เซอร์ บางที Roslyn อาจเร็วกว่าในทางทฤษฎีสำหรับ WebApplication (พร้อมไฟล์ proj) แต่สำหรับ WebSites ดูเหมือนว่าจะช้าลงอย่างมากผ่าน csc ในโฟลเดอร์ App_Code ... ทุกคนเห็นสิ่งเดียวกัน?
Stefan Anghel

4
หมายเหตุสำหรับ WebForms ในการคอมไพล์กับ C # 6 คุณต้องติดตั้งแพ็คเกจ NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatformและการพึ่งพาMicrosoft.Net.Compilers

3
โปรดทราบว่าหากคุณมีเว็บไซต์มากกว่าหนึ่งแห่งในโซลูชันของคุณ - สิ่งที่ไม่ได้ผลวิธีที่ง่ายที่สุดในการสร้างซ้ำคือสร้างโซลูชันว่างเปล่าและเริ่มเพิ่มโปรเจ็กต์เข้าไปหลังจากเว็บไซต์ที่สองคุณจะเริ่มได้รับ "ไม่พบ csc.exe" ข้อผิดพลาด
mac

67

ดูบล็อกโพสต์นี้จากSayed Ibrahim Hashimiเกี่ยวกับวิธีการทำผ่าน VS IDE

ใน Visual Studio 2015 Update 1 เราได้รวมคุณลักษณะใหม่เพื่อทำให้สิ่งนี้ง่ายขึ้น เมื่อคุณเปิดโซลูชันซึ่งมีโครงการเว็บอย่างน้อยหนึ่งโครงการซึ่งกำหนดเป้าหมายเป็น. NET 4.5+ และไม่มีแพ็คเกจ DotNetCompilerPlatform NuGet ในเมนูโครงการคุณจะเห็นตัวเลือกใหม่เปิดใช้งาน C # 6 / VB 14 ปรากฏขึ้น
ใส่คำอธิบายภาพที่นี่

ปรับปรุง

VS 2017 และ 2019 มีคุณลักษณะนี้ย้ายไปรูปร่าง -> ASP.NET รวบรวม ใส่คำอธิบายภาพที่นี่


2
คุณรู้หรือไม่ว่ารายการนี้อยู่ที่ไหนใน Visual Studio 2019?
ป้องกัน

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

1
ฉันเปิดโครงการเว็บไซต์ที่ใช้โฟลเดอร์เก่ากว่าใน VS2019 และต้องไฟล์> บันทึกโครงการก่อนที่ตัวเลือกนั้นจะปรากฏขึ้น
Corgalore

15

ฉันติดตั้ง DotNetCompilerPlatform ตามที่ @jbtule แนะนำ แต่ก็ยังได้รับข้อผิดพลาดเหมือนเดิม

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

ฉันปิดโซลูชันลบโฟลเดอร์ bin และ obj จากนั้นเปิดโซลูชันและสร้างใหม่ ตอนนี้คุณสมบัติ C # 6 ใช้งานได้


3
เพียงแค่ปิดและเปิด VS ใหม่ก็ใช้ได้ผลสำหรับฉัน (หลังInstall-Package ...) ยังกำหนดเป้าหมาย 4.6
rwalter

1
สิ่งนี้ใช้ได้ผลสำหรับฉันเช่นกันสังเกตว่าการใช้ resharper อาจแสดงข้อผิดพลาดที่ผิดพลาดใช้เวลาสักครู่เพื่อหาสาเหตุที่ทำให้ฉันได้รับ "สัญลักษณ์ไม่สามารถแก้ไขได้" ทั่วทุกมุมมอง ...
Niklas

1
ในกรณีของฉันฉันต้องรอประมาณ 30 วินาทีหลังจากเปิดโซลูชันอีกครั้งและใช้งานได้โดยไม่ต้องลบbinและobj.
Marc.2377

12

วิธีแก้ไขที่เป็นไปได้นำมาจากความคิดเห็นในบล็อกโพสต์ของ ScottGu (ค้นหา "8026" ในหน้า):

ข้อเสนอแนะวิธีแก้ปัญหา 1 (David Taylor)

เพิ่มองค์ประกอบโค้ด RTM เหล่านี้ใน 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>

จากนั้นเพิ่ม Roslyn และ Microsoft.CodeDom.Providers. *. dll ลงในไดเรกทอรี BIN ของคุณ

มันง่ายพอที่จะติดตั้ง แต่ก็แปลกสำหรับฉันที่แม่แบบเริ่มต้นไม่ได้ตั้งค่าไว้ถ้าคุณเลือก. NET 4.6 เมื่อสร้าง "เว็บไซต์" ใหม่ใน VS 2015 RTM

คำแนะนำโซลูชัน 2 (มาร์ติน)

นอกเหนือจากความคิดเห็นของ David Taylor ข้างต้นดูเหมือนว่าการตั้งค่า system.codedom จะถูกต้องเมื่อสร้างเว็บแอปด้วย TargetFramework เป็น v4.5.2 เริ่มต้น การเปลี่ยน TargetFramework เป็น v4.6 ดูเหมือนจะแก้ไขการตั้งค่าคอมไพเลอร์สำหรับ CSharp ในลักษณะที่ทำให้เกิดปัญหา

วิธีแก้ปัญหาของฉันมีดังนี้:

  1. ไฟล์ / ใหม่ / ASP.NET Web Application
  2. เลือกเทมเพลต "Web API" จาก ASP.NET 4.5.2 Templates
  3. ถ่ายสำเนาขององค์ประกอบ system.codedom (และเนื้อหา) ใน web.config
  4. ใช้ Properties / TargetFramework ตั้ง Target Framework เป็น 4.6
  5. แทนที่องค์ประกอบ system.codedom ที่แก้ไขแล้วใน web.config ด้วยสำเนาที่ถ่ายก่อนที่จะเปลี่ยน TargetFramework
  6. ตี F5

หน้าแรกควรโหลดตามที่คาดไว้

สำหรับข้อมูลเนื้อหา system.codedom ทันทีหลังจากเปลี่ยน TargetFramework เป็น v4.6 มีดังนี้ (โปรดสังเกตการใช้ประเภท "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
สำหรับโซลูชัน 2 Microsoft.CSharp.CSharpCodeProviderเวอร์ชัน 4.0 หมายความว่าไม่ได้ใช้ Rosyln ดังนั้นจะไม่สามารถใช้งานได้กับ C # 6.0
jbtule

1
เมื่อย้ายจากวิธีการแก้ปัญหาเก่าให้แน่ใจว่า<LangVersion>ในไฟล์จะมีค่าเท่ากับcsproj 6อาจทำให้เกิดปัญหาได้หากเป็นอย่างอื่น
เซาโล

7

นี้ไม่ได้สำหรับโครงการเว็บไซต์ นี่คือวิธีที่คุณทำสำหรับโครงการ ASP.NET MVC

คุณสามารถสลับ C # 6 ใน Visual Studio UI นี่เป็นตัวเลือกที่ง่ายมากควรลองก่อน

  1. คลิกขวาที่โครงการของคุณและเลือกProperties
  2. คลิกแท็บสร้าง
  3. แท็บบิลด์มีปุ่มขั้นสูง ...ที่ด้านล่างสุด
  4. ซึ่งจะเปิดการตั้งค่าการสร้างขั้นสูงดังที่แสดงด้านล่าง เลือก C # 6.0

ใส่คำอธิบายภาพที่นี่


@Manuzor คุณอาจจะพูดถูก นี่เป็นโครงการ ASP.NET MVC
Jess

@ ยูโชผิดอะไร? เป็นโครงการ MVC หรือไม่? คุณมีตัวเลือกขั้นสูงในการตั้งค่าการสร้างหรือไม่? คุณไม่มีตัวเลือกสำหรับเวอร์ชันภาษา C # หรือไม่? คุณตั้งค่าเวอร์ชันและไม่สามารถใช้คุณสมบัติภาษาได้หรือไม่?
Jess

@ เจส: อาคงทำงานอยู่ ฉันไม่ได้สังเกตว่าข้อผิดพลาดของฉันมาจาก IntelliSense ไม่ใช่จากบิลด์
Ucho

การตั้งค่านี้ดูเหมือนจะไม่นำไปใช้กับรหัสในหน้า aspx <% Eval(whatever) %>เช่น
คริส

5

นี่คือสิ่งที่ดูเหมือนใน VS2017 ด้วยโครงการเว็บไซต์:

ใส่คำอธิบายภาพที่นี่


ฉันขอขอบคุณงานครอบตัด @Uwe แต่ฉันไม่คิดว่าฉันไม่เห็นด้วยกับการลบส่วนที่เหลือของการนำทางด้านบนเนื่องจากบริบทหายไปสำหรับตำแหน่งที่รายการเมนูเฉพาะนี้ควรอยู่
b_levitt

1
VS 2017 ล่าสุดได้ย้ายสิ่งนี้ไปที่ 'Build -> ASP.NET Compilation' ดูคำตอบที่อัปเดตของฉัน
Vertigo

สำหรับประเภทโครงการเว็บไซต์ฉันได้ทดสอบคำตอบของ @ b_levitt เมื่อ VS2019 (1) ตรวจสอบว่าคุณมี web.config ถ้าไม่เพิ่มอย่างใดอย่างหนึ่ง (2) บันทึกโซลูชันโดยเลือกบนโซลูชัน Explorer และออก [Ctrl] + [S] (3) เลือกโปรเจ็กต์บน Solution Explorer และเปลี่ยน Target Framework เป็น 4.7.2 (4) เลือกตัวเลือก "Enable latest C # ... " จากเมนู Build> ASP.NET Compilation
Denny Jacob

2

ฉันได้รับข้อผิดพลาดนี้หลังจากทำการเปลี่ยนแปลงเป็นศูนย์กับโปรเจ็กต์ WebAPI ของฉัน ฉันถอนการติดตั้งแพ็กเกจ DotNetCompilerPlatform nuget และติดตั้งใหม่ซึ่งช่วยแก้ปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.