【问题标题】:Targeting .NET 4.0 gives invalid Win XP application since TFS .NET 4.5 upgrade自 TFS .NET 4.5 升级以来,以 .NET 4.0 为目标提供无效的 Win XP 应用程序
【发布时间】:2013-05-03 09:14:06
【问题描述】:

我们有一个 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 的解决方案。

有什么想法吗?

【问题讨论】:

  • 关于构建服务器、C# 和 .NET 的问题如何off-topic on Stack Overflow?投票结束的人显然只阅读问题标题,而不是内容......
  • 好吧,不管你怎么想,Hans Passant,这个问题是完全可以重现的。如果我们在构建服务器(或我们的开发机器)上安装 .NET 4.5,生成的 .exe 在 Windows XP 上会失败。即使该解决方案针对 .NET 4,而不是 4.5。如果我们删除 .NET 4.5,生成的 .exe 可以在 Windows XP 上运行。纯粹而简单。
  • 我来自 Microsoft .NET Framework 团队。支持使用 .NET4.5 工具集构建 .NET4 应用程序。我刚刚遇到了正在做这件事的大公司。你能把重现问题的重现项目发给我吗?发送到 Microsoft dot com 的 netfx45compat。感谢 Varun Gupta .NET 框架团队

标签: c# .net-4.0 windows-xp .net-4.5 tfsbuild


【解决方案1】:

.net 4.5 升级了 .net 4.0,因此如果您在构建服务器上安装了 .net 4.5,并且您的目标是 .net 4.0,那么这与您在 XP 上安装的 .net 4.0 不同。您无法在 XP 上安装 .net 4.5。 This Blog 更详细。

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

【讨论】:

    【解决方案2】:

    有一个old hot big topic on MSDN forum 指出,安装了 .NET 4.5 的机器上的 .NET 4.0 与安装了 .NET 4.5 的 .NET 4.0 不同,换句话说,无法在安装了 .NET 4.5 的机器上可靠地开发和测试 .NET 4.0 应用程序.NET 4.5 并且必须安装单独的开发和测试机器/环境

    尽管如此,SO 中有很多坚持相反的答案。可能来自对我的任何与之相矛盾的答案投反对票的同一作者,例如,hereherehere

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 该页面似乎针对 C++。我在我们的 C# 项目中找不到平台工具集设置。
        【解决方案5】:

        .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 程序集这样令人讨厌的事情。

        【讨论】:

        • OP 说他已经瞄准了 .NET 4.0,而且一直都是。只有 .NET 从 4.0 升级到 4.5。
        • 嗯,也许吧,但这不是它的工作方式。该构建服务器或他的假设有些混乱,从问题中不清楚这可能是什么。我已经包含了诊断以查看编译器实际生成的内容,因此他将有第二个方法来检查构建服务器在做什么。
        • 通过从构建服务器卸载 .NET 4.5 解决了这个问题。即使解决方案不针对 4.5 而仅针对 4.0。换句话说,安装 .NET 4.5 会破坏 .NET 4.0。干得好,微软。
        • 好吧,这结束了找出该服务器设置有什么问题的机会。总有一天会回来的。不知道为什么你认为这是微软做错的事情,你需要在 50 英尺半径范围内查看,给予或接受。
        • @HansPassant,"the answer you accepted is wrong about that...simply target .NET 4.0 instead of 4.5"。恕我直言,我不能对这样的答案保持冷静并坚持下去。我无法在我的 Windows XP SP3(使用 .NET 4.0)中安装或运行此类“.NET 4.0 目标”应用程序,并从支持人员那里收到问题的答案,因为他们的开发人员从 VS2012 开始针对 .NET 4.0!
        猜你喜欢
        • 2012-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 2023-04-11
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多