86

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

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

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

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

因此,我正在寻找一些我无法找到并且其他人可能已经知道的惊人解决方法。

4

5 回答 5

189

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

最大的区别不是那么明显,Microsoft 对程序集的可执行标头进行了早该更改。它指定可执行文件与哪个版本的 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。 这个答案显示了一个示例 postbuild 事件。

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

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

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

于 2013-07-06T11:31:45.867 回答
21

遗憾的是,不,您不能在 XP 上运行 4.5 程序。

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

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 操作系统。

于 2013-07-06T04:22:11.223 回答
8

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

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

于 2016-05-07T09:51:24.083 回答
7

试试单声道:

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

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

于 2014-04-12T22:40:15.983 回答
4

支持 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/

于 2017-04-26T20:35:49.487 回答