gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:37:57 27 4
gpt4 key购买 nike

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

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

如果要支持XP,就没有可能上.NET 4.5了吗?

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

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

最佳答案

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

最大的区别不是那么明显,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 窗口的宽边框上。

您可以更改该版本号并将其设置回 4.00,方法是使用/subsystem 选项在您的程序集上运行 Editbin.exe。 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 兼容性是一个传奇,除非向他们指出,否则管理人员通常不会认识到这一成本。将成本转给客户,他们往往会更快地做出正确的决定 :) 但我们无法帮助您。

关于c# - 是否可以在 XP 上运行 .NET 4.5 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17499351/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com