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

标签 c# .net

我们有各种版本的基础应用程序:

  • 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 没有安装)?

最佳答案

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

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

    用 .NET 3.5 编译它,然后用你当前的配置运行它,它会显示 4.0 - 然后切换行,它会显示 2.0。参见 this MSDN article了解更多详情。

  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,因为通用协方差。

关于c# - 在 .NET Framework 3.5 或 4.0 上运行的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9285915/

相关文章:

c# - 重复的连接字符串错误

c# - 使用 Task.Run 时避免捕获当前执行上下文

c# - 在 C# 中获取域 LogonServer

.net - 我应该如何将项目聚集成一个图形化有意义的有序集合?

C# 4.0 如何获取给定字符串的 64 位哈希码

c# - 如果返回多维数组,这个方法该如何设计呢?

c# - 根据多个条件外部连接两个数据表

c# - 如何在 wpf 中使用 DateTimePicker 绑定(bind)

c# - 如何处理Process类返回的错误?

c# - 我在 Linq To SQL 数据上下文中遇到空引用异常,我什至不知道从哪里开始