在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>
相關連結:
- 在ASP.NET WSP模式中,啟用C# 6.0(Roslyn)編譯器
- 在ASP.NET WSP模式中,啟用C# 7.0(Roslyn)編譯器
- 快速進行WSP網站之C#(Roslyn)編譯器相關檔案覆蓋作業
- 在不使用nuget的情況下,讓WSP可以在VisualStudio中使用C#新語法
更新:
依據Microsoft更新度越來越隨意的roslyn資訊表示,Version 3.8以上已經是C# 9.0的範疇了。詳見Roslyn NuGet-packages: Microsoft.Net.Compilers.Toolset