首先,我已阅读以下内容:
所以,从最后一个子弹开始,我真的认为没有办法解决这个问题,但我必须看看我是否可以获得明确的答案,因为我的团队希望从.NET 4.0升级到.NET 4.5。但是,我们必须支持XP。
如果我们想支持XP,是不是可以使用.NET 4.5?
我唯一能想到的是创建两个独立的解决方案,但如果我们使用.NET 4.5功能,那么代码库就必须分歧。
所以,我正在寻找一些我找不到的惊人解决方法,其他人可能已经知道了。
答案 0 :(得分:183)
我对发布这个答案犹豫不决,实际上它在技术上是可行的,但在实践中它并不能很好地发挥作用。 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
...
.NET 4.5的新特性是编译器将子系统版本更改为6.00。在很大程度上因为Windows关注这个数字而导致的更改过多,而不仅仅是检查它是否足够小。它还打开了appcompat功能,因为它假定程序是为了在旧版本的Windows上运行而编写的。这些功能会带来麻烦,尤其是Windows在Aero窗口大小方面的问题很麻烦。当它可以看到该程序被设计为在具有Aero的Windows版本上运行时,它会停止在Aero窗口的胖边界上撒谎。
您可以通过使用/ subsystem选项在程序集上运行Editbin.exe来更改该版本号并将其设置回4.00。 This answer显示了一个示例后期事件。
然而,关于好消息结束的地方,一个重要问题是.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兼容性具有传奇色彩,除非向他们指出。将成本转发给客户,他们倾向于更快地做出正确的决定:)但我们无法帮助您。
答案 1 :(得分:21)
Sadly, no, you can't run 4.5 programs on XP.
来自Connect页面的相关帖子:
Microsoft于23/03/2012 10:39发表 谢谢你的报道。此行为是在.NET Framework 4.5 Beta中设计的。支持的最低操作系统是Windows 7,Windows Server 2008 SP2和Windows Server 2008 R2 SP1。 Windows XP不是Beta版本支持的操作系统。
答案 2 :(得分:7)
尝试单声道:
http://www.go-mono.com/mono-downloads/download.html
此下载适用于所有版本的Windows XP,2003,Vista和Windows 7。
答案 3 :(得分:7)
Mono项目放弃了Windows XP支持,“忘记”提及它。虽然他们仍然声称Windows XP SP2是支持的最低版本,但它实际上是Windows Vista。
支持Windows XP的Mono的最后一个版本是3.2.3。
答案 4 :(得分: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/