gpt4 book ai didi

asp.net-core - 确定需要哪个 .NET Core 运行时

转载 作者:行者123 更新时间:2023-12-01 19:45:27 24 4
gpt4 key购买 nike

我发现了一些关于 .NET Core SDK/运行时/工具版本控制困难的有趣文章,例如:

  • .NET Core Versioning
  • .NET Core versioning
  • Supporting both LTS and Current releases for ASP.NET Core

  • 但是我仍然不知道如何在实践中处理所有这些:
  • 给定一个具有许多 .Net Core 依赖项的项目。如何确定最终用户计算机上需要使用哪个版本的运行时?
  • 运行时版本是否需要完全匹配,或者安装在最终用户机器上的运行时是否可以比所需版本更新?
  • 假设我想坚持使用某些 LTS 版本的运行时。如何确定我需要引用的软件包的版本?如何确保没有引用较新的软件包?

  • 哦,还有一个:
  • 一旦我知道最终用户机器上需要哪个运行时版本,我如何(以编程方式)确定该版本的运行时(或更新的、向后兼容的)是否可用?
  • 最佳答案

    首先,让我们看看当一个可移植的 .NET Core 应用程序通过 dotnet yourapp.dll 运行时会发生什么。 :

  • 多路复用器可执行文件(Windows 上的 dotnet.exe)从 hostfxr 下的文件夹中加载主机框架解析器( host\fxr\ )的一个版本旁边 dotnet.exe .
  • 主机框架解析器查看 yourapp.runtimeconfig.json (或者如果在使用 dotnet exec 时配置了不同的文件)来找出您的目标框架。这将提取框架名称( Microsoft.NETCore.App )和版本(例如 1.1.0 )。
  • 然后它查看 shared\Microsoft.NETCore.App 的内部可用版本的文件夹(基于框架名称)。
  • 基于可用版本和来自 yourapp.runtimeconfig.json 的框架版本它决定了使用哪个版本。或者它可能会决定出错并提示所需的版本不可用。
  • 👆 这是最困难的部分,有时也令人困惑。

  • 当前(.NET Core 1.0),框架解析器将使用适用于 runtimeconfig.json 中指定的主要和次要版本的最新补丁版本。但没有低于 runtimeconfig.json 的版本指定。例如。 1.1.2如果运行时配置指定 1.1.1,将使用运行时,但如果只有 1.1.0可用,它会记录一个错误。也没有跨次要版本的版本前滚。因此,运行时配置设置为 1.0.0 的应用程序如果只有 1.1.* 会触发错误已安装。

    对于 .NET Core 2.0,如果找不到匹配的次要版本 - 如果 1.0.5 计划了次要版本前滚和 1.1.2运行时已安装,运行时配置为 1.0.4 的应用程序将在 1.0.5 上运行运行。如果只是 1.1.2安装后,相同的应用程序将在 1.1.2 上运行.如果只是 2.0.0安装后,相同的应用程序将无法运行。见 GitHub issue for .NET Core 2+ Version Binding有关此更改的详细信息和讨论。

    让我们看看运行时配置中的值来自哪里。当您定位框架时 netcoreapp1.1 ,您使用的工具将决定:
  • 要使用哪个 NuGet 包(+ 版本),以便您获得能够编译的编译引用。
  • 哪个版本写入yourapp.runtimeconfig.json

  • 在 csproj 文件中,要使用的框架版本由属性决定
    <RuntimeFrameworkVersion>1.1.2</RuntimeFrameworkVersion>

    如果未指定此值,工具将使用 它知道的最新版本
    适用于 .NET Core 1.0 和 1.1。

    对于 .NET Core 2.0,可移植应用程序将使用补丁版本 0默认情况下,自包含应用程序将使用工具知道的最新版本。进行此更改是因为工具(CLI“SDK”/Visual Studio)更新和运行时更新已同时发布,因此应用程序默认需要在目标系统上安装新的运行时。如果未安装该运行时,则会发生错误。如果托管商需要几天的时间才能 catch 测试和安装更新,这很糟糕。仍然可以通过设置 <RuntimeFrameworkVersion> 强制/要求该版本明确地。

    关于包: 1.* 工具使用的包是元包。所以引用 Microsoft.NETCore.AppNETStandard.Library会引入很多其他 NuGet 包。 .NET Core 2.0 和 .NET Standard 2.0 不再是这种情况 - 包是扁平的,包含您需要的一切。此外,当您创建 NuGet 包时,这些包将 不再是生成的包 的依赖项.它们仅用于编译引用, Microsoft.NETCore.App 除外。知道要为自包含应用程序引入哪些附加包。

    以前,使用 NETStandard.Library 构建的库版本 1.6.1会导致使用 .NET Core 1.0 的应用程序包含大量更新的 DLL 文件,这些文件实际上是 .NET Core 1.1 的一部分.我不知道这是否意味着 LTS 政策将涵盖或不涵盖以这些 DLL 结尾的应用程序。并且很难看出它们属于哪个 .NET Core 版本,因为它们源自的包版本通常是 4.0.* , 4.1.*4.3.* .

    对于 ASP.NET Core 包,因为它们是版本控制的,所以要容易得多 1.0.*1.1.*这样您就可以看到它们来自哪个“分支”,并且您可以通过在 csproj 文件中指定 NuGet 包来更好地控制所使用的版本。

    回顾一下,让我们回到最初的问题:

    1. Given a project with a number of .Net Core dependencies. How can I determine which version of the runtime needs to be available on the end-users machine?


    这里真正的依赖是 Microsoft.NETCore.App的哪个版本被写入 yourapp.runtimeconfig.json文件。必须安装相同主次号和相同或更高补丁号的版本,将使用最新的补丁版本。安装 .NET Core 2.0 解析器时,将使用具有相同主编号的最高版本代替,但首选具有相同主编号和次编号的版本。

    如果仅安装具有较新主要版本的运行时,则该应用程序无法在目标系统上运行。 (例如 1.0.5 应用程序和只有 2.0.0 运行时)

    1. Does the runtime version need to match exactly, or can the runtime installed on the end-users machine be newer than the required version?


    运行时配置的版本是最低要求。要选择正确版本的较新运行时,请参见上文。

    1. Let's say I want to stick to some LTS version of the runtime. How can I determine the version of the packages I need to reference? How can I make sure that no newer packages are referenced?

    Microsoft.NETCore.App的版本将自动从目标框架推断(例如 netcoreapp1.0 => 1.0.* ,补丁版本取决于您使用的工具版本)。要覆盖版本,请设置 <RuntimeFrameworkVersion>属性如上所述。

    如果新的 NuGet 包被传递引用,例如通过从 .NET Core 1.0 应用程序使用 Newtonsoft.Json 10.0.0(参见 GitHub issue),一些额外的 DLL 可能会添加到项目的输出中。这些是较新版本的 DLL,它们是运行时的一部分,但会覆盖运行时中的版本。

    如果你真的想确保你不使用任何 FTS 版本,你需要在你的 csproj 文件中明确引用所有这些包,这样 NuGet 将降级所用包的版本(并发出包降级警告)。

    这里的问题是,没有在 1.0 和 1.1 包中没有修复问题的情况。如果将来支持 1.0 和 2.0 但不再支持 1.1 时这将成为问题,我们将不得不看看如何逐案处理。 (尽管社区肯定有压力/要求发布更新的 1.1 版本,即使 Microsoft 的支持未涵盖)。

    如果您使用 2.0或更高版本,这些实现包将从您的应用程序的依赖关系图中修剪掉,并且在部署时不再考虑。这是作为冲突解决逻辑的一部分发生的,该逻辑知道新的平面包包含与单个包相同的 DLL 文件。

    1. Once I know which runtime version is required on the end-users machine, how can I determine (programmatically) if that version of the runtime (or a newer, backwards compatible one) is available?

  • 扫描 shared\Microsoft.NETCore.App dotnet.exe 旁边的子文件夹并实现主机使用的相同逻辑。
  • PInvoke 进入最新的 native 代码 hostfxr.dllhost\fxr旁边 dotnet.exe .但这做起来相当复杂。
  • 关于asp.net-core - 确定需要哪个 .NET Core 运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44240029/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com