在ASP.NET WSP模式中,啟用C# 9.0(Roslyn)編譯器

轉眼間2020年末.NET Framework 4.8被微軟宣告為最後一版,之後要朝著.NET 5直奔而去,最新的C# 9.0也宣告只支援.NET 5,所以還在使用WSP(Web Site Project)與.NET Framework的老屁股們,這個大概是這一系列文章的終點了。若對於這一系列的文章沒有概念的人,建議從相關連結的文章開始看起會比較舒服一點,在這邊我僅僅列出如何實作讓WSP可以硬上C# 9.0(Roslyn 3.x)以及相關調整。

Step 1. 將Windows Server升級到.NET Framework 4.8

請用虔誠與哀悼的心情下載.NET Framework 4.8離線安裝檔案,包含主檔案繁體中文語言包。

升級後若之前有搞過WSP直接支援C# 6.0之類的動作,基本上所有的網站都會爛掉,因為csc.exe與相關的DLL都被重新蓋掉了,回到C# 5.0時期的環境。對了,記得去調整一下web.config讓WSP網站真正的以.NET Framework 4.8環境運行,調整後重新啟動VS,諸如「cookieSameSite="Strict"」無法解析警告之類的蚯蚓線(毛毛蟲)會消失。

<compilation targetFramework="4.8" />
<httpRuntime targetFramework="4.8" />

Step 2. 用nuget下載Microsoft.Net.Compilers.Toolset

Microsoft.Net.Compilers被微軟改名部門換成Microsoft.Net.Compilers.Toolset,估計是為了大一統的.NET 5讓出namespace康莊大道,請使用下列指令安裝,在撰寫文章當下Roslyn LTS版本號為3.8.0。

nuget.exe install Microsoft.Net.Compilers.Toolset

Step 3. 變更檔案權限

在C:\Windows\Microsoft.NET\Framework64\v4.0.30319下的檔案,會受到TrustedInstaller的保護,這意味著就算是Administrator身分要覆蓋檔案都有困難,因此請利用相關連結中的「快速進行WSP網站之C#(Roslyn)編譯器相關檔案覆蓋作業」的頁面指示,快速的產生出takeown、icacls等批次指令。

以系統管理員身分開啟CMD,到C:\Windows\Microsoft.NET\Framework64\v4.0.30319資料夾下貼上批次指令,讓管理者有權限可變更這些檔案。

Step 4. 檔案覆蓋

把nuget取得的\tasks\net472下的檔案(資料夾不用)全部複製,貼到C:\Windows\Microsoft.NET\Framework64\v4.0.30319資料夾下,完成後重新開機即完成。

補充:VisualStudio 2019使用WSP與C# 8.0語法說明

有執行環境後,編輯環境也是要兼顧,接下來這些做法其實做完後在VisualStudio 2017也可以編譯器正常運作,只是IDE環境下始終無法解析C# 8.0語法(VisualStudio 2017編輯器最極限只能支援到C# 7.x的寫法解析),因此如果不想看到語法下方出現蚯蚓線(毛毛蟲)的話,請安裝VisualStudio 2019。

Step 1. 將Microsoft.Net.Compilers.Toolse的\tasks\net472下的檔案(資料夾不用)全部複製,貼到bin\roslyn下。

Step 2. 使用nuget去抓取最新的Microsoft.CodeDom.Providers.DotNetCompilerPlatform,撰寫文章當下的版本號是3.6.0版。抓下來後到\lib\net45目錄下把DLL複製,貼到\bin目錄即可。

Step 3. 接下來開啟web.config,進行下列的補充修正:

<system.codedom>
  <compilers>
    <compiler extension=".cs" language="c#;cs;csharp" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701;612;618" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </compilers>
</system.codedom>

相關連結:

更新:

依據Microsoft更新度越來越隨意的roslyn資訊表示,Version 3.8以上已經是C# 9.0的範疇了。詳見Roslyn NuGet-packages: Microsoft.Net.Compilers.Toolset

Enable Initial .NETCompiler ASP.NET Csc.exe Version System.CodeDom.Compiler VisualStudio WSP WebSiteProject C#6.0 C#7.0 C#7.1 C#7.2 C#7.3 C#8.0 C#9.0 Debug EnableWindows Explorer File Folder Permission Change Modify Script AutoBatch