内容简介:我前陣遇到一個 ASP.NET Core 2.0 專案,在我安裝完 .NET Core 2.1 SDK 之後,卻發生網站無法正常運作的問題。經過一番研究之後,發現了一些有趣的現象,特此紀錄這段學習歷程。首先,要能重現這個問題,必須符合以下環境要求:用以下命令建立 ASP.NET Core 2.1 的 MVC 專案
我前陣遇到一個 ASP.NET Core 2.0 專案,在我安裝完 .NET Core 2.1 SDK 之後,卻發生網站無法正常運作的問題。經過一番研究之後,發現了一些有趣的現象,特此紀錄這段學習歷程。
重現問題
首先,要能重現這個問題,必須符合以下環境要求:
- 已安裝 .NET Core SDK 2.1.300 ( .NET Core Runtime 2.1.0 )
- 已安裝 .NET Core SDK 2.1.302 ( .NET Core Runtime 2.1.2 )
用以下命令建立 ASP.NET Core 2.1 的 MVC 專案
dotnet new mvc -n mvc20
使用 Visual Studio Code 開啟 mvc20
目錄。
建立 global.json
設定檔,並設定 SDK 版本為 2.1.300
( .NET Core 2.1.0 ),代表我想用舊版的 .NET Core SDK 執行 ASP.NET Core 應用程式。
dotnet new globaljson --sdk-version 2.1.300
除了建立 global.json
之外,也可以直接修改 mvc20.csproj
並指定 Microsoft.AspNetCore.App
的 Version
屬性為 2.1.0
,這樣也可以重現問題。總之就是維持原有應用程式使用舊版的 NuGet 套件執行。
然後執行
dotnet run
執行的過程中,請手動修改 Views/Home/Index.cshtml
引發 View 自動重新編譯。此時到瀏覽器「重新整理」網頁,就會看到以下錯誤:
The type 'RazorViewAttribute' exists in both 'Microsoft.AspNetCore.Mvc.Razor, Version=2.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' and 'Microsoft.AspNetCore.Mvc.Razor, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
發生原因
從 .NET Core 2.0 開始,有個 Roll forward 機制,他會自動搜尋目前的 .NET Core Runtime 是否有新版本,如果有新的 minor (次版號) 版本,就會自動選用最新的版本來載入,如果有新的 patch (修訂號) 自然也是。也就是說,如果系統中安裝了 .NET Core 2.0 與 2.1 版本,預設會自動選用最新版本 2.1 來執行。
備註:依據 語意化版本 2.0.0 中的定義,版本編號為 主版號(major).次版號(minor).修訂號(patch)
。
以我們的這個例子來說,我的主機安裝了 2.1.0 與 2.1.1 版本,但是我們卻限定了 .NET Core SDK 使用舊版,照理說他不會去找新版的 NuGet 套件才對。但這個問題已經被確認為 2.1.0
的 Bug ,而且也在 2.1.1
版正式被 修復 。
解決方案
解決方法其實很簡單,既然是 Bug,就沒甚麼好說的了,直接用新版執行 .NET Core 即可。同時,也建議將快取中的 NuGet 套件刪除,以免載入到有問題的 NuGet 套件。刪除的命令如下:
dotnet nuget locals all --clear
學習心得
追查這個問題,讓我了解到幾個有趣的細節。
-
在
.csproj
檔案中,並沒有指定Microsoft.AspNetCore.App
中繼套件的版本號!意思也就是說,當專案透過
dotnet run
執行的時候,會以 .NET Core Runtime 預設的Microsoft.AspNetCore.App
套件版本來載入。但我要怎樣知道他載入哪些套件與版本呢?我從
dotnet build -v d
輸出的建置紀錄中,找到許多 MSBuild 的執行細節,其中找到一個Sdk.DefaultItems.targets
檔案。循著蛛絲馬跡找到C:\Program Files\dotnet\sdk\2.1.300\Microsoft.NETCoreSdk.BundledVersions.props
檔案,裡面定義了BundledAspNetCoreAllPackageVersion
屬性。此時真相大白,原來Microsoft.AspNetCore.App
中繼套件的預設版本號,是跟著 .NET Core SDK 一起走的!所以,以後我們只要安裝了新版本的 .NET Core SDK,專案什麼都不用改,直接重新建置與發行,就會是新版了!
-
我要怎樣才能知道
Microsoft.AspNetCore.App
中繼套件到底載入了那些組件?如果你想知道 Microsoft.AspNetCore.App 到底包含哪些相依的 NuGet 套件,只要到 NuGet Gallery 查詢即可。但如果想找到實際載入了哪些組件與版本,可以參考以下範例程式:
var referencedAssemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies(); foreach (var assembly in referencedAssemblies) Console.WriteLine($"{assembly.Name} {assembly.Version}");
相關連結
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Perl语言入门
[美] Randal L.Schwartz、Tom Phoenix / 李晓峰 / 中国电力出版社 / 2002-8 / 48.00元
本书第一版于1993年问世,并从此成为畅销书。本书由Perl社区最著名、最活跃的两位成员写成,是Perl程序设计语言的精髓指南。 Perl最初只是Unix系统管理员的一个工具,在工作日里被用在无数的小任务中。从那以后,它逐步发展成为一种全功能的程序设计语言,特别是在各种计算平台上,它被用作Web编程、数据库处理、XML处理以及系统管理——它能够完成所有这些工作,同时仍然是处理小的日常工作的完......一起来看看 《Perl语言入门》 这本书的介绍吧!