gpt4 book ai didi

.net - 何时以及为什么需要supportedRuntime 元素和sku 属性?

转载 作者:行者123 更新时间:2023-12-04 02:27:02 27 4
gpt4 key购买 nike

在 Visual Studio 中创建的大多数(如果不是全部)C#(以及 F# 和 VB)库和可执行项目中,自动添加了 app.config。指定运行时版本和目标框架名字对象 (TFM) 的文件:

<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
. . .

即使没有 app.config整个文件,编译器似乎总是生成一个程序集级属性,如 ILDASM 所示:
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01    // ....NETFramework
.. // ,Version=v4.6.1.
bytes snipped-> .. // .T..FrameworkDis
.. // playName..NET Fr
61 ) // amework 4.6.1
.csproj文件确实指定了目标框架,我猜这是在构建期间将目标传递给编译器的地方。

如果没有 <startup>,可执行文件似乎运行得很好。配置文件中的部分。 The documentation解释了属性是什么意思,但是,看到它们很多年,我一直不明白为什么在配置文件中需要它们。然而,我主要处理 Windows 的桌面应用程序。

This answer明确指出“使编译为目标 .NET 4.0 的程序表现得像在更高版本上运行是不可能的”,相反,如果在较低版本的框架上运行程序也是可能的,我会感到非常惊讶。

那么,在什么场景下应用开发者需要在 .config中指定runtime的版本和TFM呢?应用程序的文件,它是否必须始终复制由编译器硬编码到二进制文件中的信息?乍一看,这个要求似乎违反直觉。

更新 2018-06-29:X-ref:我要求澄清 GitHub 问题 dotnet/docs#6234 中的文档.

最佳答案

需要声明您的应用程序实际上与哪些框架版本兼容。假设我们有一个以 .NET Framework 4.7.2 为目标的应用程序,并尝试在仅安装了 .NET Framework 4.5 的机器上运行它。如果我们添加这个 app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup></configuration>

Windows 将显示一个很好的错误消息,要求安装所需的框架版本:

error message

如果我们省略 app.config,Windows 将尝试运行它,然后应用程序将在第一次遇到特定于 .NET Framework 4.7.2 的功能时崩溃,并且在已安装的框架版本中不存在。

请注意,文档中说“所有使用 .NET Framework 1.1 或更高版本构建的应用程序都应使用此元素”的说法具有误导性。它可能被解释为“应用程序在 .NET 1.1+ 上运行需要此元素”,而实际上它仅意味着 .NET 1.1 更改了以前在 .NET 1.0 中使用的语法 requiredRuntime句法。更多时候不是 supportedRuntime应用程序不需要运行,它只是为了漂亮。
supportedRuntime 时的一种常见情况是 真的应用程序运行所需的条件是我们有面向 .NET 2.x-3.x 的应用程序并尝试在只有 4.x 的机器上运行它(例如,Windows 10 有 4.6+ 但没有 .NET 2。 x-3.x 默认安装)。在这种情况下,没有 supportedRuntime在 app.config 中,应用程序根本不会运行,即使 4.x 大部分与以前的版本兼容。添加 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />将解决问题。

因此,总而言之,它不会复制程序集元数据中的信息,而是为 Windows 提供有关如何将应用程序与其兼容的框架版本连接起来的附加信息,以及如果目标计算机上不存在该版本要求用户安装什么版本.

关于.net - 何时以及为什么需要supportedRuntime 元素和sku 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47298916/

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