C# 自TFS.NET 4.5升级以来,针对.NET 4.0的Win XP应用程序无效

C# 自TFS.NET 4.5升级以来,针对.NET 4.0的Win XP应用程序无效,c#,.net-4.0,windows-xp,.net-4.5,tfsbuild,C#,.net 4.0,Windows Xp,.net 4.5,Tfsbuild,我们有一个TFS构建服务器(我认为它在TFS术语中被称为构建控制器)。它构建并部署了多个解决方案。其中一个解决方案是一个以.NET 4完整配置文件和x86为目标的Windows窗体项目,该项目过去在Windows XP上运行良好,但现在无法运行,并显示以下消息: *.exe在Windows XP上不是有效的win32应用程序 我们有一个3个月前的构建,它运行良好,此后源代码中没有任何相关更改。但是当现在从构建服务器请求新的构建时,生成的.exe(有许多.dll支持)不能在Windows XP 3

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

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

我们有一个3个月前的构建,它运行良好,此后源代码中没有任何相关更改。但是当现在从构建服务器请求新的构建时,生成的.exe(有许多.dll支持)不能在Windows XP 32位上运行。同样的版本在Windows7 32位和Windows7 64位上运行良好

我最好的猜测是,在过去的三个月里,构建服务器上安装了一些东西,这起了作用。已经安装了很多东西,包括.NET4.5、VisualStudio2012等。但是,它不应该改变针对4.0的解决方案


有什么想法吗?

尝试将平台工具集更改为使用Visual Studio 2010。然后重新构建,希望这可能对您有用。net 4.5升级了.net 4.0。因此,如果您在构建服务器上安装了.net 4.5,并且您的目标是.net 4.0,那么这与您在XP上安装的.net 4.0不同。您不能在XP上安装.net 4.5。更详细地说


基本上,如果您想支持XP,就不能使用.net 4.5/Visual Studio 2012。(或将其安装在生成计算机上)

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

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

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

当目标版本设置为6.00时,Windows将关闭这样的谎言。并且停止程序在XP上运行,它不知道6.00版意味着什么。假设安装了SP2,则该值仅上升至5.02

无需回到旧版本的VisualStudio,您接受的答案是错误的。解决方法非常简单(您实际上不想使用Editbin.exe),只需将目标锁定在.NET 4.0而不是4.5。NET 4.0实际上在XP上可用。编译器相应地将目标操作系统版本保持在4.00。如果您300%确信实际上已经瞄准了.NET4.0,那么在构建机器配置中就有问题了。一些令人讨厌的事情,比如使用c:\windows\microsoft.net或GAC中的程序集引用而不是c:\program files\reference assembly。

有一种说法,即安装了.net 4.5的计算机上的.net 4.0与安装了.net 4.5的计算机上的.net 4.0不同,换句话说,无法在计算机上/从计算机上可靠地开发和测试.net 4.0应用程序安装了.NET 4.5,并且必须安装单独的开发和测试机器/环境


尽管如此,坚持相反的观点有很多答案。可能是同一位作者否决了任何与我的答案相矛盾的答案,例如,

这对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,因为配置文件似乎与我正在进行的依赖项注入有关。在VisualStudio 2013更新4上创建Wi7。< /P>该页面似乎面向C++。我在我们的C#项目中找不到平台工具集设置。OP说他已经瞄准了.NET4.0,而且一直都是。只有.NET从4.0升级到了4.5。好吧,也许吧,但这不是它的工作方式。关于构建服务器,或者他的假设有点混乱,从问题中不清楚这可能是什么。我已经包括了诊断,以查看编译器实际生成的内容,这样他就有了第二种方法来检查生成服务器正在执行的操作。通过从生成服务器卸载.NET 4.5,问题得到了解决。即使解决方案的目标不是4.5,而是4.0。换句话说,安装.NET4.5会破坏.NET4.0。干得好,微软。好吧,这就结束了任何发现服务器设置错误的机会。总有一天会回来的。不知道为什么你认为这是微软做的错事,你需要在50英尺的半径范围内观察,不管是给予还是索取。@HansPassant,
“你接受的答案是错误的……只需将目标锁定在.NET 4.0而不是4.5”
。尽管我向你们表示敬意,但对于这样的回答,我不能平静,不能坚持下去。我无法在我的Windows XP SP3中安装或运行此类针对.NET 4.0的应用程序(使用