我们有各种版本的基础应用程序:
- 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。参见 this MSDN article了解更多详情。
您的应用程序定位的框架版本很重要。如果您的配置指定您支持 .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,因为通用协方差。
关于c# - 在 .NET Framework 3.5 或 4.0 上运行的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9285915/