【问题标题】:How to make an application compatible with .NET 4.0 and .NET 4.5如何使应用程序与 .NET 4.0 和 .NET 4.5 兼容
【发布时间】:2023-04-03 16:50:02
【问题描述】:

我对 .NET 和 C# 还是很陌生。

我最近承担了将我的应用程序从 .NET 4.0 升级到 .NET 4.5 的任务,以跟上我团队中的其他产品。

我希望能够在 .NET 4 和 .NET 4.5 上运行我的应用程序(其中有几个项目,一些基于 ASP .NET 的 Web 项目和一些独立的应用程序项目(控制台应用程序))。

按照有关<supportedRuntime> Element 的在线说明通过更改目标运行时从.NET 4.0 升级到.NET 4.5,我意识到compilation 元素的targetFramework 属性现在是4.5。我知道这意味着代码肯定可以在 .NET 框架 4.5 上运行。

如果我有一组仍在运行 .NET 4.0 的等待 4.5 升级的节点怎么办。我很确定我的更改会破坏应用程序。

所以我做了一些研究,在参考了一些在线文档后,我从解决方案中项目的supportedRuntime 文件中的supportedRuntime 元素中删除了sku 属性。尽管supportedRuntime 元素的version 属性仍然是v4.0(CLR 版本)。我希望这能让应用程序同时在 .NET Framework 4.0 和 4.5 上运行。

但除了我从ASP .NET configuration guidelines 中读到的内容之外,我对compilation 元素及其意义并不太了解。离开targetFramework 是否会确保我的应用程序在 .NET 4.0 和 .NET 4.5 上都可以运行?

如何确保我的更改与 .NET 4.0 和 .NET 4.5 兼容?

[为什么不将其保留为 .NET 4.0,直到节点升级其 .NET 框架?]

您可能想知道为什么我现在不能将其保留为 .NET 4.0。 目的是升级到 .NET 4.5。但独立脚本运行在一组节点上,这些节点在不支持 .NET 4.5 的 Windows Server 2003 上运行。我已经让我的系统管理员团队单独为这个过程分配另一个带有 .NET 4.5 的节点。所以目前我还不能真正完全升级我现有的代码。直到我在 .NET 4.5 上测试我现有的代码并将部署配置到这些新节点之后。 感谢@hvd 的评论,它在我困惑的大脑中点亮了一个灯泡。现在我知道如何继续了。

【问题讨论】:

  • 我可能遗漏了一些东西,但您为什么不简单地将您的应用程序保留为 .NET 4.0?这应该已经在具有 .NET 4.5 的系统上运行。
  • 感谢@hvd,这很有意义。现在我该如何结束这个问题。

标签: c# .net upgrade compatibility


【解决方案1】:

.NET Framework 的版本控制不同于运行时的版本控制(CLR 和抖动)。在以前的版本中已经如此,.NET 2.0、3.0、3.5 和 3.5SP1 使用运行时版本 v2.0.50727。

对于 4.0 分支来说非常相似,版本 4.0、4.0.1、4.0.2、4.0.3、4.5、4.5.1 和 4.5.2 都使用相同的运行时版本,v4.0.30319

添加了“sku”属性以向 CLR 提供额外检查,以确保机器上存在正确的框架版本。和权力this feature,非常可取。没有它,您的 4.5 目标项目将在仅安装 4.0 的机器上正常启动。但是往往会因为一个非常丑陋的运行时异常而失败,通常是由缺少类型或方法引起的。特别是 4.5 中的更改影响很大,类型从一个程序集移动到另一个程序集,以使框架在便携式设备上的占用空间更小。 This question 是一个很好的例子,很难诊断。

EventWaitHandle.WaitOne(int) 重载就是一个很好的例子。在 .NET 2.0SP2(又名 3.5)中添加。一个好主意,没有人知道如何正确使用 WaitOne(int, bool) 重载。但是在 mscorlib 的 [AssemblyVersion] 中没有相应更改的重大更改。导致可怕的问题,程序员使用重载与 gusto 但他们的程序在旧版本的 .NET 上运行时失败。带有 MissingMethodException 的 Kaboom,几乎没有留下任何简单而常用的方法会丢失的线索。

冷酷的事实是,如果您在项目中以 4.5 为目标并删除 sku,那么您将处理这种痛苦。您必须以 4.0 为目标以保持兼容性,这当然很简单。

【讨论】:

    【解决方案2】:

    事实上,如果您在项目属性中将框架版本更改为 4.0,您将确定 4.5 程序集成员(命名空间、类、接口...)在设计时间/开发时间将不可见。否则,如果您尝试使用版本 4.5 中的成员,编译器会哭泣。

    这可能是确保您不会使用以前 .NET Framework 版本中不存在的新成员的最佳方法。

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      相关资源
      最近更新 更多