是否可以在XP上运行.NET 4.5应用程序?


86

首先,我阅读以下内容:

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

如果我们要支持XP,是否不可能使用.NET 4.5?

我唯一想到的就是创建两个单独的解决方案,但是如果我们使用.NET 4.5功能,则代码库将不得不有所不同。

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


9
不,你不能。坚持使用4.0,直到XP完全消失。
Federico Berasategui 2013年

Answers:


187

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

最大的区别不是可见,Microsoft对程序集的可执行标头进行了逾期未做的更改。哪个指定可执行文件与哪个Windows版本兼容。XP属于上一代Windows,始于Windows2000。它们的主要版本号是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会关注该数字,而不仅仅是检查它是否足够小,因此该更改已逾期未了。由于它假定该程序是为在旧版本的Windows上运行而编写的,因此它也启用了appcompat功能。这些功能会带来麻烦,尤其是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上就是一个大爆炸。但是,当您在.NET 4.0上运行程序时,它不存在

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

仅针对4.0,所有这些问题都将消失。或打破僵局并停止支持XP,这是程序员通常无法做出的业务决策,但可以指出造成的麻烦,当然可以鼓励这样做。当然,支持古老的操作系统要付出非零的代价,只是测试工作量很大。Windows兼容性是一项传奇性的费用,除非向他们指出,否则,管理人员通常不会意识到这一点。将这笔费用转发给客户,他们往往会更快地做出正确的决定:)但是我们不能为您提供帮助。


2
谢谢汉斯,我认为这里有一些重大变化。我也很感谢这种解决方法。由于您指定的原因,我们无法使用它,但是很高兴知道。也许XP会自动消失好哪天....
贾斯汀Pihony

3
just the testing effort is substantial-那就是我们管理“允许放弃XP支持”的原因。
Christoph Fink 2014年

我知道这是一个过时的帖子-但是-@JustinPihony:您的公司是否曾经考虑过安装更高版本的操作系统,然后再安装VMWare或Virtual Box?对于Windows 7来说有点晚了-但是Microsoft放弃了虚拟Windows XP安装,允许您在7和XP之间切换。只是一个想法。:-)
Mark Manning

@MarkManning不在我们的控制范围内。它正在其他地方使用。
贾斯汀·皮洪尼

1
@JustinPihony:啊。嗯……我唯一的建议是克鲁格。捕获OS版本,然后在类中设置所有要放入数组(或数组)的函数。有一个阵列(或阵列的一部分)用于XP,另一阵列用于较新的OS。然后,您需要的是某种全局变量,该全局变量用于表示要使用的集合。调用可能全部相同(或看起来相同),但一组使用NET40_ <FUNCTION>,而其他组使用NET45_ <FUNCTION>。这将是对函数本身的间接调用。那有意义吗?
马克·曼宁


8

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

支持Windows XP的Mono的最新版本是3.2.3。


7

尝试单声道:

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

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


2
Mono比.NET慢,尽管它具有.NET 4.5的大多数功能,但缺少某些主要组件,如WPF(mono-project.com/Compatibility)。因此,如果Mono提供了您所需的全部功能,那么您可以使用Mono的XP支持,并且对性能的影响还可以。从好的方面来说,不需要创建特殊的“ Mono构建”,普通的.NET 4.5构建通常在Mono下运行,但是您需要专门针对Mono测试以确保兼容。
Qwertie 2014年

2
我在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”
Cristian Ciupitu

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.