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

Jus*_*ony 85 .net c# compatibility .net-4.0 .net-4.5

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

所以,从最后一个子弹,我真的认为没有办法解决这个问题,但我必须看看我是否可以获得一个明确的答案,因为我的团队希望从.NET 4.0升级到.NET 4.5.但是,我们必须支持XP.

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

我唯一能想到的是创建两个独立的解决方案,但如果我们使用.NET 4.5功能,那么代码库就必须分歧.

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

Han*_*ant 184

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

最大的区别并不是那么明显,微软对程序集的可执行文件头进行了长期的改变.其中指定了可执行文件兼容的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
            ...
Run Code Online (Sandbox Code Playgroud)

.NET 4.5的新特性是编译器将子系统版本更改为6.00.在很大程度上因为Windows关注这个数字而导致的更改过多,而不仅仅是检查它是否足够小.它还打开了appcompat功能,因为它假定程序是为了在旧版本的Windows上运行而编写的.这些功能会带来麻烦,尤其是Windows在Aero窗口大小方面的问题很麻烦.当它可以看到该程序被设计为在具有Aero的Windows版本上运行时,它停止在Aero窗口的胖边界上撒谎.

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

然而,关于好消息结束的地方,一个重要问题是.NET 4.5与.NET 4.0不兼容.到目前为止,最大的问题是类被从一个程序集移动到另一个程序集.最值得注意的是,[Extension]属性发生了这种情况.以前在System.Core.dll中,它已移至.NET 4.5中的Mscorlib.dll.如果您声明自己的扩展方法,那么这就是XP上的kaboom,您的程序说要在Mscorlib中查找属性,由.NET 4.5版本的System.Core引用程序集中的[TypeForwardedTo]属性启用.但是当你在.NET 4.0上运行程序时它就不存在了

当然,没有任何东西可以帮助您停止使用仅在.NET 4.5上提供的类和方法.执行此操作时,在4.0上运行时,程序将失败并出现TypeLoadException或MissingMethodException

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

  • "只是测试工作量很大 - 这就是我们的管理"允许放弃XP支持". (3认同)
  • 谢谢汉斯,我认为有一些重大变化.我也很欣赏这种解决方法.我们不能因为您指定的原因而使用它,但很高兴知道.也许XP有一天会永远消失.... (2认同)

Ozt*_*aco 21

可悲的是,不,你不能在XP上运行4.5程序.

以及Connect页面中的相关帖子:

微软发表于23/03/2012 10:39
感谢您的报告.此行为是在.NET Framework 4.5 Beta中设计的.支持的最低操作系统是Windows 7,Windows Server 2008 SP2和Windows Server 2008 R2 SP1.Windows XP不是Beta版本支持的操作系统.


小智 7

尝试单声道:

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

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

  • Mono比.NET慢,虽然它具有.NET 4.5的大多数功能,但它缺少某些主要组件,如WPF(http://www.mono-project.com/Compatibility).所以你可以使用Mono for XP支持,如果它提供你所需要的一切,你就可以了解性能.从好的方面来说,不需要创建一个特殊的"Mono构建",正常的.NET 4.5构建通常在Mono下工作,但是你需要专门针对Mono进行测试以确保你兼容. (2认同)
  • 我在Windows XP SP3下尝试过mono-3.12.1-gtksharp-2.12.26-win32-0.msi,它失败了*"mono.exe不是一个有效的Win32应用程序"*.我也尝试了单声道3.0.10-gtksharp-2.12.11-win32-0.exe失败了*"mono.exe - 未找到入口点.程序入口点InterlockedCompareExchange64无法在动态链接库中找到KERNEL32.dll中"*. (2认同)

小智 7

Mono项目放弃了Windows XP支持并"忘记"提及它.虽然他们仍然声称Windows XP SP2是支持的最低版本,但它实际上是Windows Vista.

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