【问题标题】:Is it possible to run a .NET 4.5 app on XP?是否可以在 XP 上运行 .NET 4.5 应用程序?
【发布时间】:2013-07-04 04:11:38
【问题描述】:

首先,我已阅读以下内容:

所以,从最后一个项目开始,我真的认为没有办法解决这个问题,但我必须看看我是否能得到一个明确的答案,因为我的团队想从 .NET 4.0 升级到 .NET 4.5。但是,我们必须支持 XP。

如果我们想支持 XP,是否有可能转到 .NET 4.5?

我唯一能想到的就是创建两个独立的解决方案,但是如果我们使用 .NET 4.5 功能,那么代码库将不得不分道扬镳。

所以,我正在寻找一些我找不到但其他人可能已经知道的惊人解决方法。

【问题讨论】:

  • 不,你不能。坚持使用 4.0,直到 XP 彻底消失。

标签: c# .net .net-4.0 compatibility .net-4.5


【解决方案1】:

我犹豫是否发布此答案,这在技术上实际上是可行的,但在实践中效果不佳。 CLR 和核心框架程序集的版本号在 4.5 中没有更改。您仍然以 CLR 的 v4.0.30319 为目标,并且框架程序集版本号仍然是 4.0.0.0。当您使用 ildasm.exe 之类的反汇编程序查看程序集清单时,唯一与众不同的地方是存在一个表明需要 4.5 的 [TargetFramework] 属性,该属性必须进行更改。实际上没那么容易,它是由编译器发出的。

最大的区别不是那么明显,微软对程序集的可执行文件头进行了早该更改。它指定可执行文件与哪个版本的 Windows 兼容。 XP 属于上一代 Windows,从 Windows 2000 开始。它们的主要版本号是 5。Vista 是当前一代的开始,主要版本号 6。

.NET 编译器始终将最低版本号指定为 4.00,即 Windows NT 和 Windows 9x 的版本。您可以通过在程序集上运行 dumpbin.exe /headers 来查看这一点。示例输出如下所示:

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            ...
            4.00 operating system version
            0.00 image version
            4.00 subsystem version              // <=== here!!
               0 Win32 version
            ...

.NET 4.5 中的新功能是编译器将该子系统版本更改为 6.00。一个过期的更改在很大程度上是因为 Windows 会注意这个数字,而不仅仅是检查它是否足够小。它还打开了 appcompat 功能,因为它假定该程序是为在旧版本的 Windows 上工作而编写的。这些功能会造成麻烦,尤其是 Windows 与 Aero 中的窗口大小相当的方式很麻烦。当它可以看到程序被设计为在具有 Aero 的 Windows 版本上运行时,它就不会在 Aero 窗口的粗边框上撒谎了。

您可以通过使用 /subsystem 选项在程序集上运行 Editbin.exe 来更改该版本号并将其设置回 4.00。 This answer 显示了一个示例 postbuild 事件。

然而,好消息到此为止,一个重要的问题是 .NET 4.5 与 .NET 4.0 不太兼容。到目前为止,最大的问题是课程从一个大会转移到另一个大会。最值得注意的是,[Extension] 属性发生了这种情况。之前在 System.Core.dll 中,它在 .NET 4.5 中移至 Mscorlib.dll。如果您声明自己的扩展方法,那是 XP 上的一个问题,您的程序说要在 Mscorlib 中查找该属性,该属性由 System.Core 参考程序集的 .NET 4.5 版本中的 [TypeForwardedTo] 属性启用。但是当您在 .NET 4.0 上运行程序时它不存在

当然,没有什么可以帮助您停止使用仅在 .NET 4.5 上可用的类和方法。当您这样做时,您的程序在 4.0 上运行时将因 TypeLoadException 或 MissingMethodException 而失败

只需针对 4.0,所有这些问题都会消失。或者打破僵局并停止支持 XP,这是程序员通常不能做出的业务决策,但肯定可以通过指出它造成的麻烦来鼓励。必须支持古老的操作系统当然有非零成本,只是测试工作量很大。管理层通常不承认成本,Windows 兼容性是传奇,除非向他们指出。将这笔费用转嫁给客户,他们往往会更快地做出正确的决定 :) 但我们无法帮助您。

【讨论】:

  • 谢谢汉斯,我认为有一些重大变化。我也很欣赏这种解决方法。由于您指定的原因,我们不能接受它,但很高兴知道。也许有一天 XP 会永远消失......
  • just the testing effort is substantial - 这就是我们的管理层“允许放弃 XP 支持”的原因。
  • 我知道这是一篇旧帖子 - 但是 - @JustinPihony:您的公司有没有想过安装更高版本的操作系统,然后安装 VMWare 或 Virtual Box? Windows 7 有点晚了——但微软放弃了一个虚拟的 Windows XP 安装,允许你在 7 和 XP 之间切换。只是一个想法。 :-)
  • @MarkManning 它不在我们的控制范围内。它正在其他地方使用。
  • @JustinPihony:啊。嗯......我唯一的其他建议是kluge。捕获操作系统版本,然后将类中的所有函数设置为放入数组(或数组)中。让一个阵列(或阵列的一部分)用于 XP,另一个用于较新的操作系统。那么您所需要的只是某种全局变量,用于表示要使用的集合。调用可能都相同(或看起来相同),但一组使用 NET40_,其他调用可能使用 NET45_。这将是对函数本身的间接调用。这有意义吗?
【解决方案2】:

Sadly, no, you can't run 4.5 programs on XP.

以及来自该连接页面的相关帖子:

Microsoft 于 2012 年 3 月 23 日 10:39 发布
感谢您的报告。此行为是 .NET Framework 4.5 Beta 中的设计使然。支持的最低操作系统为 Windows 7、Windows Server 2008 SP2 和 Windows Server 2008 R2 SP1。 Beta 版不支持 Windows XP。

【讨论】:

    【解决方案3】:

    Mono 项目放弃了对 Windows XP 的支持,并且“忘记了” 提及它。尽管他们仍然声称 Windows XP SP2 是受支持的最低版本,但它实际上是 Windows Vista。

    支持 Windows XP 的最后一个 Mono 版本是 3.2.3。

    【讨论】:

      【解决方案4】:

      试试单声道:

      http://www.go-mono.com/mono-downloads/download.html

      此下载适用于所有版本的 Windows XP、2003、Vista 和 Windows 7。

      【讨论】:

      • Mono 比 .NET 慢,虽然它具有 .NET 4.5 的大部分功能,但它缺少某些主要组件,如 WPF (mono-project.com/Compatibility)。因此,如果 Mono 提供了您所需要的一切,并且您对性能影响没有问题,那么您可以使用 Mono 来支持 XP。从好的方面来说,不需要创建特殊的“Mono 构建”,正常的 .NET 4.5 构建通常在 Mono 下工作,但您需要专门针对 Mono 进行测试以确保兼容。
      • 我在 Windows XP SP3 下尝试了 mono-3.12.1-gtksharp-2.12.26-win32-0.msi,但失败了 "mono.exe 不是有效的 Win32 应用程序"。我还尝试了 mono-3.0.10-gtksharp-2.12.11-win32-0.exe,但失败并显示 "mono.exe - 未找到入口点。无法在动态中找到过程入口点 InterlockedCompareExchange64链接库 KERNEL32.dll".
      【解决方案5】:

      支持 Windows XP (SP3) 的最后一个版本是 mono-4.3.2.467-gtksharp-2.12.30.1-win32-0.msi,它不会取代 .NET 4.5,但可能对某些应用程序感兴趣。

      看那里: https://download.mono-project.com/archive/4.3.2/windows-installer/

      【讨论】:

        最近更新 更多