2017-10-16 186 views
8

我有一個csproj文件下面的代碼:<TargetFramework>和<RuntimeFrameworkVersion>有什麼區別?

<TargetFramework>netcoreapp1.0</TargetFramework>

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

現在讓我們說我在同一個csproj文件下面的代碼:

<TargetFramework>netcoreapp1.0</TargetFramework> <RuntimeFrameworkVersion>1.1.4</RuntimeFrameworkVersion>

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

我基本上是試圖.NETCore 2.0之前,使用最新的框架(有一些EF問題,當我轉換)這將是.NETCore 1.1.4,但csproj中的多個Framework屬性使我不確定要使用哪個標記。我無法找到明確區分兩者之間差異的任何資源。

回答

9

TargetFramework所使用的NuGet來解決依賴性,並確定要用於編譯和構建應用程序的資產。 (在幕後,TargetFrameworkMonikerTargetFrameworkVersion等其他一些屬性開始發揮作用,但SDK將其抽象爲更簡單的TargetFramework以瞭解它所瞭解的框架)。

RuntimeFrameworkVersion特定於.NET Core/netcoreapp。 SDK將爲RuntimeFrameworkVersion設置的版本注入對Microsoft.NETCore.App的依賴關係,或者使用它所知道的.NET Core < 2.0的最新版本。然後將解析後的版本寫入到.NET Core主機框架解析器的runtimeconfig.json文件中,以解析要加載的共享框架的版本(例如=> .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,並且發佈了一個新版本的SDK,它知道更新的.NET Core修補程序版本,它將自動使用最新版本。如果您明確設置版本,則可能無法在不編輯項目文件的情況下保持最新狀態。
  • RuntimeFrameworkVersion也是最小的運行時,該應用程序將加載 - 如果你將其設置爲1.0.4,並嘗試一個機器,只安裝了1.0.3上運行,除非您編輯runtimeconfig.json文件的應用程序將無法啓動。
  • RuntimeFrameworkVersion可以設置爲浮動版本,這在定位預覽版本或每日構建時非常有用,例如, 2.1.0-preview1-*將解析爲配置的NuGet提要上可用的最新preview1版本。

除了這些,只有幾個原因,以建立使用更高版本的Microsoft.NETCore.App,像構建bug修正爲DiaSymReader組件。

在.NET 2.0核心的RuntimeFrameworkVersion版本將永遠是2.0.0爲「便攜式應用程序」(非自包含的),因爲框架的執行是由Microsoft.NETCore.App的依賴,這NuGet包不再提供只用於提供用於編譯的參考程序集。

+2

這是一個夢幻般的答案!先生,幹得好。 –

+0

那麼,在上面的代碼示例中具有兩個屬性的實際結果是什麼? 'RuntimeFrameworkVersion'標籤明確規定NuGet所看到的,優先於'TargetFramework'標籤。但是,如果我省略了TargetFramework標籤,則該項目無法使用* TargetFramework值「無法識別」。它可能拼寫錯誤。如果不是,則必須明確指定TargetFrameworkIdentifier和/或TargetFrameworkVersion屬性。* – 8protons

+2

目標框架指定用於編譯的包的片段。所以如果你寫'foobar1.0',它將無法工作。另外,'RuntimeFrameworkVersion'特定於'netcoreapp'目標框架 –

2

從文檔,你應該使用runtimeframeworkversion只

如果針對.NET的核心,當需要運行時的特定版本,你應該在你的項目中使用的財產(例如,1.0.4),而不是引用元組件。

https://docs.microsoft.com/en-us/dotnet/core/tools/csproj

+3

只有在需要特定版本的Microsoft.NETCore.App包時纔可以使用'RuntimeFrameworkVersion'。只有有限數量的用例需要實際執行此操作。 –

+2

如果我註釋掉我的TargetFramework標籤,我的'Microsoft.NET.TargetFrameworkInference.targets'文件中出現以下錯誤:「TargetFramework值」未被識別,可能拼寫錯誤,如果不是,則TargetFrameworkIdentifier和/或TargetFrameworkVersion屬性必須明確指定「 – 8protons

相關問題