<TargetFramework>和<RuntimeFrameworkVersion>之间有什么区别?

8pr*_*ons 34 .net entity-framework visual-studio nuget .net-core

我在csproj文件中有以下代码:

<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,但是多个Framework属性csproj让我不确定使用哪个标签.我无法找到任何明显区分两者之间差异的资源.

Mar*_*ich 48

TargetFramework所使用的NuGet来解决依赖性,并确定要用于编译和构建应用程序的资产.(在幕后,还有一些类似的属性TargetFrameworkMonikerTargetFrameworkVersion开始发挥作用,但SDK将其抽象为更简单TargetFramework的框架知识).

RuntimeFrameworkVersion/是特定于.NET的核心netcoreapp.SDK将为设置Microsoft.NETCore.App的版本注入依赖关系RuntimeFrameworkVersion,或者使用它知道的.NET Core <2.0的最新版本.然后,已解析的版本将写入runtimeconfig.json.NET Core主机框架解析程序的文件,以解析要加载的共享框架的版本(例如,=> .NET Core 1.1.4运行时).

你能够使用的原因1.1.*netcoreapp1.0是因为NuGet包实际上包含了必要的资产来构建.NET核心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-*将解析为preview1配置的NuGet供稿上可用的最新版本.

除了这些之外,使用更高版本构建的原因只有几个Microsoft.NETCore.App,例如DiaSymReader组件的构建错误修复.

在.NET Core 2.0中,版本RuntimeFrameworkVersion将始终2.0.0用于"可移植应用程序"(非自包含),因为框架的实现不再由依赖项提供,Microsoft.NETCore.App并且此NuGet包仅用于为编译提供引用程序集.

  • 这是一个很棒的答案!干得好先生. (2认同)
  • 目标框架指定用于编译的包的片.因此,如果你写`foobar1.0`,它将无法正常工作.另外,`RuntimeFrameworkVersion`特定于`netcoreapp`目标框架 (2认同)