Dot-Net

<TargetFramework> 和 <RuntimeFrameworkVersion> 有什麼區別?

  • October 16, 2017

我在文件中有以下程式碼csproj

&lt;TargetFramework&gt;netcoreapp1.0&lt;/TargetFramework&gt;

在 NuGet 包管理器中,它說我有Microsoft.NETCore.App 版本 1.0.5

現在假設我在同一個csproj文件中有以下程式碼:

&lt;TargetFramework&gt;netcoreapp1.0&lt;/TargetFramework&gt;
&lt;RuntimeFrameworkVersion&gt;1.1.4&lt;/RuntimeFrameworkVersion&gt;

NuGet 包管理器現在會說我有Microsoft.NETCore.App 版本 1.1.4

我實際上是在嘗試使用 .NETCore 2.0 之前的最新框架(轉換時出現一些 EF 問題),即 .NETCore 1.1.4,但其中的多個框架屬性csproj讓我不確定要使用哪個標籤。我找不到任何可以清楚地區分兩者之間差異的資源。

NuGet使用TargetFramework它來解決依賴關係並確定要用於編譯和建構應用程序的資產。(在幕後,更多的屬性如TargetFrameworkMonikerTargetFrameworkVersion開始發揮作用,但 SDK 將其抽象為更簡單TargetFramework的框架,以供其了解)。

特定於RuntimeFrameworkVersion.NET Core / netcoreapp. SDK 將為.NET Core < 2.0 的設置或使用它知道的最新版本注入Microsoft.NETCore.App對版本的依賴。RuntimeFrameworkVersion然後將解析的版本寫入runtimeconfig.json文件,供 .NET Core 主機框架解析器解析要載入的共享框架的版本(例如 => .NET Core 1.1.4 執行時)。

您能夠使用的原因1.1.*netcoreapp1.0因為 NuGet 包實際上包含建構 .NET Core 1.0.* 應用程序所需的資產。但是,工具不知道這一點,因此您將獲得一個 .NET Core 1.0 應用程序,但它將由 1.1 框架載入,因為這就是runtimeconfig.json文件中的內容。

重要的區別是:

  • 它只對Microsoft.NETCore.App使用哪個版本的獨立執行檔很重要。

    • 當執行一個獨立的發佈時,這個包將拉入具有所需版本的完整框架(例如dotnet publish -r win7-x64
    • 當您執行為其建構的應用程序1.0.3但已1.0.5安裝執行時時,1.0.5將自動使用執行時。
    • 如果您未設置RuntimeFrameworkVersion並且發布了了解 .NET Core 較新更新檔版本的 SDK 的新版本,它將自動使用最新版本。如果您明確設置版本,您可能無法在不編輯項目文件的情況下保持最新。
  • RuntimeFrameworkVersion也是應用程序將載入的最小執行時間 - 如果您將其設置為1.0.4並嘗試在僅已安裝的機器上執行,除非您編輯文件1.0.3,否則應用程序將不會啟動。runtimeconfig.json

  • RuntimeFrameworkVersion可以設置為浮動版本,這在針對預覽版本或每日建構時很有用,例如2.1.0-preview1-*將解析為preview1配置的 NuGet 源上可用的最新版本。

除此之外,使用更高版本的 建構只有幾個原因Microsoft.NETCore.App,例如DiaSymReader組件的建構錯誤修復。

在 .NET Core 2.0 中,版本RuntimeFrameworkVersion將始終2.0.0用於“可移植應用程序”(非自包含),因為框架的實現不再由依賴項提供,Microsoft.NETCore.App並且此 NuGet 包僅用於提供參考程序集進行編譯.

引用自:https://stackoverflow.com/questions/46778064