2017-10-16 187 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

相关问题