构建 / 运行 一个针对 .Net 4 的应用程序安装了 .Net 4 或 .Net 4.5 之间有什么区别吗?

Is there any difference between building / running an application targeting .Net 4 having installed .Net 4 or .Net 4.5?

如果您只安装了 .Net 4 Framework 或 .Net 4.5 Framework,构建/运行 以 .Net 4 为目标的应用程序有什么不同吗?

我的一位同事说,即使应用程序以 .Net 4 为目标,安装 4.5 也会有所不同,我不确定。

针对 .NET 4.0 并在带有 .NET 的服务器上构建的 HgLab(这是一个内部部署的 ASP.NET 应用程序)我遇到了 大量 问题4.5 安装。

我不使用任何花哨的东西,只使用稳定的 public API 和 明确地 目标 .NET 4.0。然而,它在 64 位系统上 kernelbase.dll 内部一直崩溃,产生无法辨认的崩溃转储,并且通常表现得非常奇怪。

我最后做的是在 64 位版本的 IIS 中启用 32 位应用程序支持 - 这似乎已经解决了问题。但一般来说,如果您想真正以 .NET 4.0 为目标,请在安装了 .NET 4.0 的构建服务器上进行构建。

NET 4.5 是 .NET 4 的 "in-place upgrade",因此即使您以 .Net 4 为目标,您也将使用 .NET 4.5,请参阅 http://www.hanselman.com/blog/NETVersioningAndMultiTargetingNET45IsAnInplaceUpgradeToNET40.aspx

总结这篇博客,可以并排安装三个主要版本的.NET:

  • .NET 1 (1.1)
  • .NET 2 (2/3/3.5)
  • .NET 4 (4/4.5)

"minor"版本正在升级中

是的,这是一个例子:

以下控制台应用程序应在未安装 .Net 4.5 或更高版本的系统上抛出 UnobservedTaskException,但如果安装了 .Net 4.5 或更高版本,它将永远循环:

private static void Main()
{
    Task.Factory.StartNew(() => { throw new InvalidOperationException("Erk"); });

    while (true)
    {
        Thread.Sleep(100);
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}

根据 Microsoft 的说法,您应该可以 configure this behaviour in App.Config,但它对我根本不起作用。