同事遇到的案例。
VS2017 新增 ASP.NET 網站專案,專案範本預設參照的 Microsoft.Net.Compilers 版本是 1.3.2。(延伸閱讀:神祕的ASP.NET bin-roslyn目錄) 同事為了使用 C# 7.0 功能,升級 Microsoft.Net.Compilers NuGet 套件到 2.7.0 版,該專案先前已部署測試過,心想 ASP.NET Runtime 版本維持 4.5.2 沒變,應該不會有問題。
殊不知,在開發機的 IIS Express 及 IIS 測試 OK,部署到測試台 IIS,冒出以下錯誤:
在 Stackoverflow 查到一則討論解答了困惑:
The culprit is the
Microsoft.Net.Compilers
package, used to support modern C# syntax/features (version 6.0, 7.0) in your project and in Razor views in particular. Depending on its version, the package requires a particular minimum version of the full .NET framework to be installed on a machine in question.For instance, the 2.2.0 package requires .NET 4.6+. Even though your project is targeting say .NET 4.5.2, you probably have the latest .NET installed on your development machine, and everything goes just fine. The remote deployment machine only has .NET 4.5.2 installed, and when your ASP.NET application tries to compile resource (e.g. views) at run time, you get error
-2146232576
.
意思是新版 Microsoft.Net.Compilers Package 支援在 .cshtml Razor 語法及專案引用 C# 6/7 新語法,但 Package 本身依賴特定的 .NET Framework 版本,即使 ASP.NET 的目標平台是 4.5.2,要使用 Microsoft.Net.Compiler 2.2.0,部署端機器必須安裝 .NET 4.6+,否則在編譯 View 將發生 -2146232576 編譯錯誤。
回頭再看 Microsoft.Net.Compilers Package 說明,原來本草綱目早有記載...
最後,為了簡化日後部署程序,同事選擇降版回 1.3.2 解決問題。而先前我常困惑為什麼在 .cshtml 不能用字串插值 $"…{varName}…",這下也有了解答。