首先,我读了以下内容:

所以,从上一个项目来看,我真的认为没有办法解决这个问题,但我必须看看能否得到一个明确的答案,因为我的团队希望从中升级.NET 4.0到.净4.5.然而,我们必须支持XP.

Is there no possibility of going to .NET 4.5 if we want to support XP?

我唯一能想到的就是创建两个独立的解决方案,但是如果我们使用.NET 4.5功能.

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

推荐答案

我不太愿意发布这个答案,它实际上在技术上是可行的,但在实践中效果不太好.CLR和核心框架程序集的版本号在4.5中没有更改.你仍然以v4为目标.CLR的0.30319和框架组件版本号仍然是4.0.0.0.当你用ildasm这样的反汇编程序查看程序集 list 时,它唯一与众不同的地方就是.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
            ...

这里有什么 fresh 事.NET 4.5是编译器将该子系统版本更改为6.00.这一变化的结束在很大程度上是因为Windows关注这个数字,而不仅仅是判断它是否足够小.它还启用了appcompat功能,因为它假定该程序是为在旧版本的Windows上工作而编写的.这些特性会带来麻烦,尤其是在Aero中,窗口大小与窗口大小相当的方式非常麻烦.当它可以看到该程序设计为在安装了Aero的Windows版本上运行时,它就不再在Aero窗口的肥边上撒谎了.

您可以通过运行Editbin来更改该版本号并将其设置回4.00.使用/subsystem选项在程序集上执行.This answer显示了一个生成后事件示例.

然而,这就是好消息的结局,一个重要的问题是.NET 4.5与Windows不太兼容.NET 4.0.到目前为止,最大的障碍是类从一个程序集转移到另一个程序集.最值得注意的是,[Extension]属性就是这样.以前在系统中.果心dll,它被移到了Mscorlib.动态链接库.净4.5.如果你声明了自己的扩展方法,你的程序会在Mscorlib中查找该属性,该属性由中的[TypeForwardedTo]属性启用.NET 4.5版本的系统.核心参考组件.但是当你在上面运行你的程序时,它就不存在了.NET 4.0

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

只要以4.0为目标,所有这些问题都会消失.或者打破僵局,停止支持XP,这是程序员不能经常做出的商业决定,但可以通过指出它造成的麻烦来肯定地鼓励他们做出这一商业决定.当然,必须支持古老的操作系统需要付出非零的成本,只是测试工作是巨大的.除非向管理层指出,否则Windows兼容性是传奇,这是管理层通常不会意识到的成本.将成本转嫁给客户,他们往往会更快地做出正确的决定:)但我们无法在这方面帮助您.

.net相关问答推荐

.NET Blazor-使用子组件中的处理程序方法进行双向数据绑定

Puppeteer LaunchAsync 在未打开浏览器的情况下挂起

从 Contentful 中的富文本元素中获取价值?

为什么 ULong > 16 位的数学会变得不稳定?

lock() 是否保证按请求的顺序获得?

通用枚举到int的C#非装箱转换?

为什么 .NET 中没有可序列化 XML 的字典?

C# 编译为 32/64 位,或任何 cpu?

如何确定字符串是 C# 中的有效 IPv4 还是 IPv6 地址?

仅使用 XAML 绘制纯色三角形

文件按文件名模式存在

C# List<> 按 x 然后 y 排序

将 SignalR 2.0 .NET 客户端重新连接到服务器集线器的最佳实践

如何判断对象是否已在 C# 中释放

如何将 MailMessage 对象作为 *.eml 或 *.msg 文件保存到磁盘

表单不响应 KeyDown 事件

使用没有catch块的try-finally块

如何从 HashSet 中检索实际项目?

可以从 C# 调用 C++ 代码吗?

MultipleActiveResultSets=True 还是多个连接?