3

我们有一个 TFS 构建服务器(我认为它在 TFS 术语中称为构建控制器)。它构建和部署了多种解决方案。其中一个解决方案是针对 .NET 4 full profile 和 x86 的 Windows Forms 项目,过去在 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 的解决方案。

有任何想法吗?

4

5 回答 5

5

.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。(或将它们安装在您的构建机器上)

于 2013-05-03T10:05:30.193 回答
1

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

不过,SO中有很多答案坚持相反的观点。可能来自相同的作者,他们反对我的任何答案,例如,这里这里这里

于 2013-05-03T17:10:56.490 回答
1

这对 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 上构建。

于 2015-06-10T22:25:07.227 回答
0

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

于 2013-05-03T09:22:02.093 回答
0

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

您可以使用 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 程序集这样令人讨厌的事情。

于 2013-05-03T11:52:14.913 回答