在.NET Framework 3.5或4.0上运行的可执行文件
本文关键字:运行 可执行文件 NET Framework | 更新日期: 2023-09-27 18:24:29
我们有各种版本的基础应用程序:
- 1.0版与.NET Framework 3.5捆绑在一起
- 2.0版与.NET Framework 4.0捆绑在一起
我们通过一个嵌入.NET可执行文件的安装程序来分发更新。此安装程序运行的PC可能具有以下基本应用程序的组合:
- 1.0版和2.0版(.NET 3.5/.NET 4.0)
- 仅限版本1.0(仅限.NET 3.5)
- 仅限2.0版(仅限.NET 4.0)
我需要确保安装程序中嵌入的.NET可执行文件能够可靠地运行。
我发现的方法建议在app.config
文件中添加以下内容:
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
几个问题:
这是否意味着它将使用.NET Framework 4.0(如果存在的话),或者求助于.NET Framework 3.5(或任何以前使用
2.0.50727
CLR的框架)?IOW,这些标签是按优先级排序的吗?生成机器上的.NET Framework版本是否对应用程序有任何运行时影响,或者
app.config
文件中版本的硬编码是否始终具有优先级?如果我添加了依赖.NET 4.0特定功能的代码,会发生什么?在
app.config
中包含2.0.50727
版本(如上所示)会导致编译时错误还是运行时错误(仅当未安装.NET 4.0时)?
-
是的,它们是按优先级排序的。使用一个简单的控制台应用程序最容易尝试:
using System; class Test { static void Main() { Console.WriteLine(Environment.Version); } }
用.NET 3.5编译它,然后用当前配置运行它,它会显示4.0,然后切换行,它会出现2.0。有关更多详细信息,请参阅MSDN的这篇文章。
-
针对应用程序的框架版本是最重要的。如果您的配置指定您支持.NET 2,但您的目标是.NET 4,则应用程序将不会启动。
-
如果不以.NET 4为目标,您就不会依赖.NET 4特有的功能,在这种情况下,它就不会在.NET 2上运行。
第3点严格来说是不准确的,因为你可以做的事情会因运行的.NET版本而异。例如,将应用程序更改为:
using System;
using System.Collections.Generic;
class Test
{
static void Main()
{
object o = new List<string>();
Console.WriteLine(o is IEnumerable<object>);
}
}
当使用.NET 2运行时,将打印False(因为IEnumerable<T>
在.NET 2中是不变的),但当使用.NET 4运行时,由于通用协方差,将打印True。