在.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>

几个问题:

  1. 这是否意味着它将使用.NET Framework 4.0(如果存在的话),或者求助于.NET Framework 3.5(或任何以前使用2.0.50727 CLR的框架)?IOW,这些标签是按优先级排序的吗?

  2. 生成机器上的.NET Framework版本是否对应用程序有任何运行时影响,或者app.config文件中版本的硬编码是否始终具有优先级?

  3. 如果我添加了依赖.NET 4.0特定功能的代码,会发生什么?在app.config中包含2.0.50727版本(如上所示)会导致编译时错误还是运行时错误(仅当未安装.NET 4.0时)?

在.NET Framework 3.5或4.0上运行的可执行文件

  1. 是的,它们是按优先级排序的。使用一个简单的控制台应用程序最容易尝试:

    using System;
    class Test
    {
        static void Main()
        {
            Console.WriteLine(Environment.Version);
        }
    }
    

    用.NET 3.5编译它,然后用当前配置运行它,它会显示4.0,然后切换行,它会出现2.0。有关更多详细信息,请参阅MSDN的这篇文章。

  2. 针对应用程序的框架版本是最重要的。如果您的配置指定您支持.NET 2,但您的目标是.NET 4,则应用程序将不会启动。

  3. 如果不以.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。