【问题标题】:converting .net application 32 bit to 64 bit将 .net 应用程序 32 位转换为 64 位
【发布时间】:2011-10-27 23:11:27
【问题描述】:

我有一个 .net 应用程序,

  • 类库(目标平台设置为Any CPU
  • Winform 应用程序(目标平台设置为Any CPU
  • 安装程序(目标平台设置为 X86 并为 .net 框架 (x86) 设置检测到的依赖项)

现在,当我在 64 位机器上通过 setup.exe 安装此应用程序时,它安装在 Program Files [x86] 文件夹中;我猜这是在 64 位应用程序上模拟 32 位环境的 WoW64 功能。

现在,当客户要求将其转换为 64 位时,如果 32 位版本本身可以通过 WoW64 正常工作,为什么对他来说很重要?将其转换为 64 位会带来性能优势吗?

当我尝试将其转换为 64 位时,是否需要全部更改,即,

  • 类库(将目标平台更改为 64)(如果我跳过这一步怎么办?)
  • Winform 应用程序(将目标平台更改为 64)(如果我也跳过这个怎么办?)
  • 安装程序(将目标平台更改为 64)[检测到的依赖项列表未显示任何 .NET 框架 x64 选项,为什么?]

请提出建议。

【问题讨论】:

    标签: c# .net visual-studio 32bit-64bit


    【解决方案1】:

    无需转换,您的应用已作为 64 位进程运行。因为你在 EXE 项目上使用了 AnyCPU。您将其安装到了错误的文件夹中,但如果没有其他进程尝试以编程方式启动您的文件夹,这并不重要。这非常罕见。

    从 TaskMgr.exe 的“进程”选项卡中验证这一点。 32 位进程的进程名称后有 *32。

    通过将安装项目的 TargetPlatform 设置更改为 x64 让您的客户满意,以便将其安装在 c:\program 文件中。需要您几分钟。

    【讨论】:

    • 是的,我看到进程名称没有任何 *32,即使目标平台是 anycpu。但是,前提条件是 .net framework 2.0 (x86) 并且仍然以 64 位运行。
    • 这是因为您机器上的 .NET 2.0 安装程序只能安装 x86 版本。请务必选择 .NET 3.5 SP1,它会创建一个更小的安装程序。如有必要,它使用 Internet 下载 .NET。顺便说一句,64 位版本的 Windows 已经预先安装了 .NET,因此取消依赖关系也很好。以及没有可用的 x64 安装程序的原因。
    【解决方案2】:

    您可以将 .NET 代码项目保留在 AnyCPU 上,但是要安装到 64 位上而不需要更改您提到的安装程序项目属性所需的 32 位 WOW 内容。

    如果您在安装程序中有自定义操作,当您更改为 64 位时,这些操作可能不起作用。您可能会收到BadImageFormatException。要解决此问题,您需要处理生成的 MSI:

    http://adamhouldsworth.blogspot.com/2010/10/64bit-custom-actions.html

    如果您的应用程序是独立的,它不会对客户端产生太大影响。转到 64 位时,除了访问更多 RAM 之外,没有免费的性能优势(尽管 JIT 有不同类型的优化可用)。

    我见过的唯一需要 64 位的情况是,当您在另一个应用程序中使用该 DLL 时,您不能在单个进程中混合位。

    更新:可能缺少 64 位框架先决条件是因为您使用的是 VS 2005?

    http://social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/7b00f4e9-64e3-4fb6-9906-880820ecda92

    【讨论】:

    • 但为什么我在检测到的依赖项对话框中没有看到 .NET Framework 2.0(64 位)选项?
    • @EagerToLearn 在我面前没有安装程序的项目,我无法真正回答 - 抱歉。
    • 在创建 64 位安装程序时,我不应该期望在先决条件对话框中看到 .NET Framework 2.0 (x64) 的选项吗?
    • @EagerToLearn 我假设是这样,但是我不知道 .NET Framework 2 的先决条件是否假设一点。
    • 我使用的是 Visual Studio 2008,但应用程序是基于 2.0 框架构建的
    【解决方案3】:

    64 位可能会或可能不会产生性能差异。 64 位应用程序也可以使用(方式)比 32 位应用程序更多的内存。

    如果您在 64 位操作系统上启动 AnyCpu exe,它应该以 64 位启动(请参阅任务管理器,32 位进程在此处附加 *32)。如果将应用程序设置为 x64,则库必须是 x64 或 AnyCpu。

    如果您没有纯 x64 的原生引用,您可以将 exe 和 dll 保留为 AnyCpu,但您需要将设置修改为 x64。

    至于框架,在 x64 机器上(这是 x64 应用程序运行的唯一地方),框架始终包含 32 位和 64 位,位于 C:\Windows\Microsoft.NET\Framework 和 Framework64分别。

    【讨论】:

    • 那么 .NET Framework 依赖项呢,我在检测到的依赖项对话框中没有看到 .NET Framework 2.0(64 位)的任何选项
    • 我的开发机器是 32 位的,在为 64 位应用程序创建安装程序时,我在检测到的依赖项对话框中看不到 .NET Framework 2.0(64 位)的选项。我该怎么办
    【解决方案4】:

    现在,当我在 64 位机器上通过 setup.exe 安装此应用程序时,它安装在 程序文件 [x86] 文件夹;我猜这是在 64- 上模拟 32 位环境的 WOW 功能 位应用。

    不,它与程序无关,仅与安装程序有关。

    •安装程序(目标平台设置为 X86,检测到的依赖项设置为 .net framework(x86))

    32位安装程序将其安装在程序的32位文件夹中,无论程序是32位还是64位。

    遗憾的是,您不能让一个安装程序同时执行这两种操作 - 您需要一个 32 位安装程序和一个 64 位安装程序,从设计上来说。

    这完全是 MSI 部分的设计决定,与程序完全无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-25
      • 2010-09-29
      • 2015-04-05
      • 2021-01-22
      • 2014-09-11
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      相关资源
      最近更新 更多