同事遇到的案例。

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}…",這下也有了解答。

ASP.NET web project throwed Roslyn -2146233576 error after deployed to test server. The root cause is that cshtml compilation is executed by /bin/ryslon/csc.exe and it requires .NET Framework 4.6+. And I also know why $"..." is not supported in .cshtml.


Comments

# by Alan

大大您好:不知道為什麼我開啟 .cshtml 之後都會顯示一個錯誤 "命名空間 'System' 中沒有類型或命名空間名稱 'Linq' (是否遺漏了組件參考?)" 問題是我沒使用到 Linq 的功能啊,而且我也不能在最上面使用 @using System.Linq; 也會說找不到這個命名空間

# by Jeffrey

to Alan, 沒遇過,試試網友的解法:https://stackoverflow.com/a/39765911/288936

# by Mickey

黑大您好,所以我想確認一下我的理解 Compiler Version 與 .NET FrameWork 版本基本上是有相依性的存在對嗎? 今天就算我本地端 用了新版的Compiler Version 成功編譯後的檔案 就算 Copy 到執行環境也未必能夠 Run 對吧?

# by Jeffrey

to Mickey,可以這麼說沒錯。依據:This package can compile code targeting any platform, but can only be run using desktop .NET 4.6 Full Framework.

Post a comment