首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >何时以及为什么需要supportedRuntime元素和sku属性?

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

Stack Overflow用户
提问于 2017-11-15 03:35:31
回答 2查看 4K关注 0票数 13

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

代码语言:javascript
运行
复制
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
. . .

即使完全没有app.config文件,编译器似乎总是生成程序集级属性,如ILDASM所示:

代码语言:javascript
运行
复制
.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>部分的情况下,可执行文件似乎运行得很好。文献资料解释了这些属性的含义,但多年来,我从未理解为什么配置文件中需要这些属性。不过,我主要是为Windows处理桌面应用程序。

这个答案明确指出,“不可能让编译为目标.NET 4.0的程序像在更高版本上运行一样”,相反,如果在框架的较低版本上运行程序也是可能的话,我会感到非常惊讶。

那么,在什么情况下,应用程序开发人员需要在应用程序的.config文件中指定运行时的版本和TFM,并且必须始终重复编译器硬编码到二进制文件中的信息?乍一看,这一要求似乎有悖常理。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-04 05:41:21

需要声明应用程序实际兼容的框架版本。假设我们有一个以.NET Framework4.7.2为目标的应用程序,并尝试在只安装了.NET Framework4.5的机器上运行它。如果我们加上这个app.config

代码语言:javascript
运行
复制
<?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 Framework4.7.2的特性时崩溃,并且在安装的框架版本中没有。

请注意,文档误导地说,“使用.NET框架的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提供有关如何将应用程序与其兼容的框架版本连接的其他信息,以及如果目标计算机上不存在应用程序,则要求用户安装的版本。

票数 2
EN

Stack Overflow用户

发布于 2019-03-03 15:11:47

targetFramework属性主要确定用于编译目的的.NET框架。它还用于确定引用.NET库(DLL)的兼容性。但是,当您将.NET项目作为应用程序分发并将其部署到其他计算机上时,就会出现一个问题。问题是“如果目标计算机在编译期间没有安装.NET框架版本,会发生什么情况?”这就是supportedRuntime元素有一定意义的地方。supportedRuntime元素列表中的第一个版本匹配将用于运行该应用程序。如果supportedRuntime元素中没有一个版本与目标计算机上安装的版本匹配,那么将使用框架的最新版本来运行应用程序。

我希望这个解释能回答你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47298916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档