在Visual中创建的大多数(如果不是全部) 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>
部分的情况下,可执行文件似乎运行得很好。文献资料解释了这些属性的含义,但多年来,我从未理解为什么配置文件中需要这些属性。不过,我主要是为Windows处理桌面应用程序。
这个答案明确指出,“不可能让编译为目标.NET 4.0的程序像在更高版本上运行一样”,相反,如果在框架的较低版本上运行程序也是可能的话,我会感到非常惊讶。
那么,在什么情况下,应用程序开发人员需要在应用程序的.config
文件中指定运行时的版本和TFM,并且必须始终重复编译器硬编码到二进制文件中的信息?乍一看,这一要求似乎有悖常理。
更新2018-06-29: X:我要求澄清GitHub问题dotnet/docs#6234中的文档。
发布于 2019-04-04 05:41:21
需要声明应用程序实际兼容的框架版本。假设我们有一个以.NET Framework4.7.2为目标的应用程序,并尝试在只安装了.NET Framework4.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 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提供有关如何将应用程序与其兼容的框架版本连接的其他信息,以及如果目标计算机上不存在应用程序,则要求用户安装的版本。
发布于 2019-03-03 15:11:47
targetFramework属性主要确定用于编译目的的.NET框架。它还用于确定引用.NET库(DLL)的兼容性。但是,当您将.NET项目作为应用程序分发并将其部署到其他计算机上时,就会出现一个问题。问题是“如果目标计算机在编译期间没有安装.NET框架版本,会发生什么情况?”这就是supportedRuntime元素有一定意义的地方。supportedRuntime元素列表中的第一个版本匹配将用于运行该应用程序。如果supportedRuntime元素中没有一个版本与目标计算机上安装的版本匹配,那么将使用框架的最新版本来运行应用程序。
我希望这个解释能回答你的问题。
https://stackoverflow.com/questions/47298916
复制相似问题