自TFS.NET 4.5升级以来,以.NET 4.0为目标提供了无效的Win XP应用程序

本文关键字:NET 无效 Win 应用程序 XP 5升 TFS 目标 | 更新日期: 2023-09-27 18:11:52

我们有一个TFS构建服务器(我认为它在TFS术语中被称为构建控制器(。它构建并部署了几个解决方案。其中一个解决方案,一个针对.NET 4完整配置文件和x86的Windows窗体项目,过去在Windows XP上运行良好,现在无法运行,并显示消息:

*.exe不是Windows XP 上的有效win32应用程序

我们有一个3个月前的构建,运行良好,从那以后,源代码中没有任何相关的更改。但是,当现在从生成服务器请求新的生成时,生成的.exe(带有大量支持它的.dll(无法在Windows XP 32位上运行。同样的构建在Windows 7 32位和Windows 7 64位上运行良好。

我最好的猜测是,在过去三个月里安装在构建服务器上的一些东西正在发挥作用。已经安装了很多东西,包括.NET 4.5、Visual Studio 2012等。不过,它不应该改变以4.0为目标的解决方案。

有什么想法吗?

自TFS.NET 4.5升级以来,以.NET 4.0为目标提供了无效的Win XP应用程序

.net 4.5升级了.net 4.0,所以如果您在构建服务器上安装了.net 4.5,并且您的目标是.net 4.0,那么这与您在XP上安装的.net 4.0不同。您不能在XP上安装.net 4.5。本博客将提供更多详细信息。

基本上,如果你想支持XP,你就不能使用.net 4.5/View Studio 2012。(或者将它们安装在您的构建机器上(

MSDN论坛上有一个古老的热门话题,安装了.NET 4.5的机器上的.NET 4.0与安装了.NET 4.5.NET 4.0不同。换句话说,无法在安装了.NET 4.5%的机器上可靠地开发和测试.NET 4.0应用程序,必须单独进行开发和测试机器/环境

尽管如此,SO坚持相反的观点也有很多答案。可能来自同一作者,他们否决了与我的答案相矛盾的任何答案,例如,here,here

这对OP来说可能为时已晚,但我遇到了这个问题,并找到了一个恰好适用于我的修复程序。构建我的项目会在输出文件夹中生成一个.exe.config文件。此配置有一个启动部分,其中包含:

supportedRuntime version="v.4.0" sku=".NETFramework,Version=v4.5"

我把4.5改为4.0,现在我的项目在XP(Service Pack 2(上运行,没有问题。我链接的所有包和dll都是为4.0构建的。我并没有仔细查看它来找出罪魁祸首,但我怀疑它是Microsoft.Practices.Unity,因为配置文件似乎与我正在进行的依赖项注入有关。使用Visual Studio 2013 Update 4在Win7上构建。

尝试更改平台工具集以使用Visual Studio 2010。然后重建,希望这可能对您有效

中包含的编译器。NET 4.5利用了一个隐藏的知识。XP不支持NET 4.5。这让他们可以做一些早该做的事情。NET程序,它们最终可以更改目标操作系统的版本。它编码在EXE和DLL头中,从那以后一直设置为Windows版本4.00。NET首次发布。

您可以使用SDK工具看到目标版本号,Dumpbin.exe/headers命令会显示它。Editbin.exe实用程序可以在您生成后使用/SUBSYSTEM选项更改它。这将是一种修补程序使其在XP上运行的方法。

Windows会注意EXE中的这个字段。当它看到的目标版本小于6.00时,它会认为该程序最初是为在Vista之前的旧版本Windows上运行而编写的。然后打开一些appcompat功能。最激烈的一点是,它会假设您的程序对启用Aero功能时显示的窗口上的胖边界一无所知。它将谎报窗口大小,返回比实际窗口大小小6个像素的值。当一些程序员试图做一些事情,比如让窗口对齐时,这个谎言会让他们非常困惑。

当目标版本设置为6.00时,Windows将关闭类似的谎言。并停止程序在XP上运行,它不知道6.00版本意味着什么。假设安装了SP2,它只会上升到5.02。

不需要回到旧版本的Visual Studio,您接受的答案是错误的。解决方法非常简单(您实际上并不想使用Editbin.exe(,只是针对目标。NET 4.0而不是4.5。NET 4.0实际上在XP上是可用的。编译器相应地将目标操作系统版本保持在4.00。如果你有300%的把握实际上已经瞄准了。NET 4.0,那么在构建机器配置中出现了一些混乱。一些讨厌的东西,比如使用c:''windows''microsoft.net或GAC中的程序集引用,而不是c:''program files''reference程序集。