将.NET应用程序从32位转换为64位

7

我有一个.net应用程序,

  • 类库(目标平台设置为Any CPU
  • Windows窗体应用程序(目标平台设置为Any CPU
  • 安装程序(目标平台设置为X86并检测到依赖项设置为.net framework(x86))

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

当客户要求将其转换为64位时,如果32位版本通过WoW64正常工作,那么对他来说这是否重要?将其转换为64位会带来性能优势吗?

当我尝试将其转换为64位时,我需要为所有内容进行更改吗,即,

  • 类库(将目标平台更改为64)(如果我跳过此步骤会怎样?)
  • Windows窗体应用程序(将目标平台更改为64)(如果我也跳过这一步会怎样?)
  • 安装程序(将目标平台更改为64)[检测到的依赖项列表没有显示任何.NET framework x64选项,为什么?]

请给出建议。

4个回答

9
无需转换,您的应用程序已经作为64位进程运行。因为您在EXE项目上使用了AnyCPU。如果没有其他进程尝试以编程方式启动您的进程,则安装到错误的文件夹并不重要。这种情况极为罕见。
从TaskMgr.exe的“进程”选项卡中验证此信息。32位进程在其进程名称后面有*32。
通过将安装程序项目的TargetPlatform设置更改为x64,使客户满意,这样它就会被安装在c:\program files中。只需几分钟即可完成。

是的,我看到进程名称没有任何*32,即使目标平台是anycpu。但是为什么前提条件是.NET Framework 2.0(x86),它仍然以64位运行呢? - EagerToLearn
这是因为你机器上的.NET 2.0安装程序只能安装x86版本。请确保选择.NET 3.5 SP1,它创建了一个更小的安装程序。如果需要,它会使用互联网下载.NET。64位版本的Windows已经预装了.NET,所以取消依赖项也没问题。而且没有x64安装程序可用的原因是什么。 - Hans Passant

6
你可以将.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
@EagerToLearn 对不起,如果我手头没有一个包含安装程序的项目,我真的无法回答这个问题。 - Adam Houldsworth
在创建64位安装程序时,我应该在“先决条件”对话框中看到.NET Framework 2.0(x64)选项,对吗? - EagerToLearn
@EagerToLearn 我认为是这样,但我不确定.NET Framework 2对位数是否有要求。 - Adam Houldsworth
我正在使用Visual Studio 2008,但应用程序是基于2.0框架构建的。 - EagerToLearn

4
64位可能会或不会带来性能差异。64位应用程序还可以比32位应用程序利用更多的内存。
如果您在64位操作系统上启动一个AnyCpu exe,则应该以64位启动(在任务管理器中查看,32位进程在那里加上*32)。如果将应用程序设置为x64,则库必须是x64或AnyCpu。
如果您没有本地x64-only引用,可以将exe和dll保持为AnyCpu,但需要将设置修改为x64。
至于框架,在x64机器上(这也是唯一运行x64应用程序的地方),框架始终包括32位和64位,分别位于C:\Windows\Microsoft.NET\Framework和Framework64中。

至于.NET Framework依赖项,我在检测到的依赖项对话框中没有看到任何选择.NET Framework 2.0(64位)的选项。 - EagerToLearn
我的开发机是32位的,当我为一个64位应用程序创建安装程序时,在“检测到的依赖项”对话框中没有看到.NET Framework 2.0(64位)选项。我该怎么办? - EagerToLearn

4
现在,当我在64位计算机上通过setup.exe安装此应用程序时,它被安装在Program Files [x86]文件夹中;我猜这是在64位应用程序上模拟32位环境的WOW特性。
不,这与程序无关,仅与安装程序有关。
32位安装程序将其安装在32位程序文件夹中,而不管程序是否为32位或64位。
遗憾的是,您不能使用一个安装程序同时完成两个任务 - 您需要一个32位和一个64位的安装程序。
这完全是MSI方面的设计决策,再次强调,与程序完全无关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接