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

2024-02-24

在 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

The .csproj文件确实指定了目标框架,我猜这是在构建过程中目标从编译器传递到编译器的地方。

可执行文件似乎运行得很好,没有<startup>配置文件中的部分。文档 https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/startup/supportedruntime-element解释what这些属性是什么意思,但是,看了很多年,我一直不明白why配置文件中需要它们。不过,我主要处理的是 Windows 桌面应用程序。

这个答案 https://stackoverflow.com/a/38036555/1149924明确指出“不可能让编译为目标 .NET 4.0 的程序表现得像在更高版本上运行一样”,相反,如果也可以在较低版本的框架上运行程序,我会感到非常惊讶。

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


更新 2018-06-29:X-ref:我要求对 GitHub 问题中的文档进行澄清点网/文档#6234 https://github.com/dotnet/docs/issues/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 将显示一条不错的错误消息,要求安装所需的框架版本:

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

请注意,文档中的说法具有误导性:“使用 .NET Framework 1.1 或更高版本构建的所有应用程序都应使用此元素”。它可能被解释为“应用程序在 .NET 1.1+ 上运行需要此元素”,而实际上这仅意味着 .NET 1.1 更改了 .NET 1.0 中以前使用的语法requiredRuntime句法。更多时候则不然supportedRuntime不是应用程序运行所必需的,它只是为了美观。

一种常见的情况是supportedRuntime is really应用程序运行所需的条件是当我们有面向 .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 提供有关如何将应用程序与其兼容的框架版本连接的附加信息,以及如果目标计算机上不存在则要求用户安装哪个版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我何时以及为什么需要supportedRuntime元素和sku属性? 的相关文章

随机推荐

  • 如何将数据随机分成三个相等大小?

    我有一个包含来自三个不同项目的 9558 行的数据集 我想将这个数据集随机分成三个相等的组 并为每个组分配一个唯一的 ID 以便Project1 Project 2 Project3变成Project1 Project2 and Proje
  • postgresql:将 bytea 转换为 bigint

    我必须将查询的 bytea 条目转换为 bigint 这怎么可能做到呢 更多信息 我有一个休眠存储库 如下所示 Query value update Sample Table set other id 1 where id 2 native
  • r 中字符变量名称的循环

    我有一个变量列表 例如 a1 a2 a3 然后我想对这些变量进行循环 例如赋值 我尝试了粘贴 它只给出了像 a1 这样的字符 这不是我真正想要的 谁能提供解决方案吗 我们可以用mget获取 a 中的值list lst lt mget pas
  • 将 csv 转换为 JSON 树结构?

    我读了这些问题 csv数据到d3中的嵌套json树 https stackoverflow com questions 19043561 csv data to nested json tree in d3 在python中从csv列表创建
  • 使用 @DefaultProperty 时“元素未定义默认属性”

    我正在尝试创建一个自定义 JavaFX 元素以在 FXML 中使用 但是当FXMLLoader尝试解析它 它抛出一个异常 指出 javafx fxml LoadException 元素未定义默认属性 然而 经过一些研究后 我相信我正确地定义
  • SQLite动态查询

    我有一个 SQLite 数据库 我想做的是用户选择一个过滤器 例如 我有一个书籍数据库 用户只想查看 阿加莎克里斯蒂的书籍 中的数据 因此 我制作了一个带有选择选项的微调器 然后有意将所选字段传递给执行查询选择的另一个活动 我的问题是 如何
  • 将内联 SQL 转换为存储过程

    我正在开发现有的 ASP NET 应用程序 当前的应用程序使用了大量的内联查询 现在他们只想将所有查询重写为存储过程 我的问题是 这些查询非常 动态 并且查询是根据不同的条件连接起来的if else条件 例如 string query Se
  • 为什么 RestTemplate 会消耗过多的内存?

    Question 为什么 Spring 的 RestTemplate 使用过多的堆 特别是G1 Old Generation 发送文件时 Context 我们观察到休息模板 https docs spring io spring frame
  • LINQ 中的条件Where 子句

    假设我在网格中显示数据 并且有许多文本框用于过滤数据 员工 ID 的文本框 如果员工 ID 文本框为空 则不会添加 where 子句 但如果不为空 则将添加 where 子句 如果工资文本框有值或员工姓名文本框有值 我们可以以同样的方式过滤
  • 经典蓝牙 (2.1) 设备可实现的最小数据包延迟是多少?

    我正在使用 RN42 http www microchip com wwwproducts en RN42 http www microchip com wwwproducts en RN42 蓝牙模块以 115200 波特率 UART S
  • gem install Rails 构建错误无法构建 gem 本机扩展

    我的主要目标是让Redmine 与WAMPServer 一起工作 我按照以下步骤操作 如何与 WampServer 一起安装 Ruby on Rails https stackoverflow com questions 2025449 h
  • 在 TypeScript 中导入 JSON 文件

    我有一个JSON文件如下所示 primaryBright 2DC6FB primaryMain 05B4F0 primaryDarker 04A1D7 primaryDarkest 048FBE secondaryBright 4CD2C0
  • jQuery、Chrome 和“selected”属性异常

    我在 Chrome 中遇到了一个问题 但我无法判断这是 Chrome 的错误 jQuery 的错误还是我的代码中的错误 我搜索了 Chromium 的未解决问题 但找不到任何内容 jQuery 也是如此 我在这里创建了一个 JSFiddle
  • 在 Node.js 中,给定一个 URL,如何检查它是否是 jpg/png/gif?

    我目前的方法是这样的 var request require request var mime require mime var fs require fs var uri http www sweetslyrics com images
  • 为什么 CodeIgniter 中的分页链接对我不起作用?

    我正在尝试对我的产品使用 codeigniter 分页 因此有多个产品页面 但它不适合我 我不知道为什么 这是我的控制器中的分页功能 code om in allecadeaus te bepalen hoeveel producten e
  • 如果必要的单元测试失败,我可以使单元测试不确定吗?

    考虑对字典对象进行单元测试 您可能编写的第一个单元测试只是将项目添加到字典并检查异常 下一个测试可能类似于测试计数是否准确 或者字典是否返回正确的键或值列表 然而 后面的每种情况都要求字典首先能够可靠地添加项目 如果添加项目的测试失败 我们
  • 贝宝和PHP?

    我有两种方法可以从用户处检查 1 if user input Amount field lt 5 user credit do update database the remain amount in my database table 2
  • 急切地评估 Prolog 中的所有谓词调用

    正在阅读有关元谓词的 SWI Prolog 文档 http www swi prolog org pldoc man section metapred 我最初假设call f 相当于f where f是一些谓词 但我观察到 在某些情况下 两
  • 是否可以用 Java 构建这样的自定义 GUI?

    我在 Photoshop 中制作了这个 我计划将其用于我的文件共享应用程序 我想知道是否可以为我的应用程序创建具有这种外观和感觉的 GUI 如果我无法仅使用 eclipse 或 NetBeans 来构建它 还有其他工具可以帮助我吗 哦 亲爱
  • 我何时以及为什么需要supportedRuntime元素和sku属性?

    在 Visual Studio 中创建的大多数 如果不是全部 C 以及 F 和 VB 库和可执行项目中 都会自动添加app config指定运行时版本和目标框架名称 TFM 的文件