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

5
我们的基础应用程序在现场有各种不同的版本:
- 版本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的框架)?换句话说,这些标记是否按优先级排序?

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

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

1个回答

11
  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 上运行。

第三点并不完全准确,因为你可以做一些事情,这些事情会根据正在运行的 .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。


目前,项目设置中的“目标框架”设置为.NET 3.5。即使没有安装.NET 3.5框架,我的应用程序也可以通过我提出的app.config设置成功运行。这有意义吗? - LeopardSkinPillBoxHat
抱歉,我刚刚阅读了MSDN文章,看起来我在上面的评论中提到的行为是可以预期的(我假设该文章中的“built against”指的是项目的“目标框架”设置?)。 - LeopardSkinPillBoxHat
经过进一步调查,我认为我在上面评论中提到的奇怪行为是由于我正在使用的Windows 7的核心组件之一,即.NET Framework 3.5引起的。看起来它实际上不能被卸载。 - LeopardSkinPillBoxHat
1
@JeremyThompson:Lambda表达式是源代码的一部分 - 只要使用C# 3编译器进行构建,您仍然可以将它们转换为委托(但不能转换为表达式树)在.NET 2中。匿名类型、隐式变量声明等也是如此。 - Jon Skeet
@JonSkeet - 没关系,无论如何感谢您的出色回答。 - LeopardSkinPillBoxHat
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接