Vista 64位系统编写的代码能否在32位操作系统上兼容?

6
我们正在获得新的开发机器,并升级到Vista 64 Ultimate以利用我们的8GB RAM。我们的经理希望我们在32位虚拟机中进行所有开发,以确保代码进入生产环境时不会出现问题。
有没有办法保证生成的程序可以在32位操作系统上运行?我不介意使用虚拟机,但我不喜欢它们将你强制返回“单”监视器类型视图的方式。我喜欢把我的VS工具栏移到另一个监视器上。
编辑:我们正在使用Visual Studio 2005和2008,VB.NET和/或C#。
编辑:使用Harpreet的answer,这些是我用来设置我的Visual Studio IDE编译x86 / 32位的步骤:
  1. 点击“生成”并打开“配置管理器”
  2. 选择“活动解决方案平台”下拉列表
  3. 如果x86在列表中,选择它并跳至步骤5,否则选择“<新建...>”
  4. 在“新建解决方案平台”对话框中,选择x86并按下确定
  5. 验证所有项目的所选平台是否为x86
  6. 点击关闭

祝使用愉快。

谢谢,Keith


顺便提一下,使用VMware Workstation作为您的虚拟机将可支持多显示器。 - Stephan Keller
7个回答

9
我在64位机器上为32位Windows进行开发,这并不是一个问题。您应确保项目设置为以x86模式编译,以保守为主。您需要逐个检查解决方案中的每个项目。您也可以使用AnyCPU设置,但这有点风险,因为它在您的开发机器上运行时将与32位机器上运行的方式不同。当然,您要避免64位模式。
我遇到的问题是驱动程序在应用程序编译为64位(显式64位或AnyCPU编译并在64位Windows上运行)时无法正常工作。通过坚持使用x86编译,完全可以避免这些问题。这应该揭示您开发机器上的所有缺陷。
理想情况下,您可以设置一个可在32位机器上经常执行的构建和测试环境。这应该让您的管理层放心,并让您避免使用VM作为桌面。

在目标平台上建立构建和测试环境是一个好习惯。如果你正在开发针对特定操作系统或操作系统版本的软件,最好在某个地方安装该操作系统的副本,以确保它能够正常工作!如果可能的话,最好将此计算机用作持续集成服务器,以便您的官方构建和官方单元测试在该环境中运行。 - Daniel Pryden

4
只要您将可执行文件编译为32位,它们就可以在32位和64位Windows计算机上运行(保证)。使用64位开发计算机的好处是,您可以开始使用64位编译测试代码(以检查指针是否转换为32位整数),从而使未来向64位过渡更加容易(如果您或您的公司选择进行64位版本)。

1

编译 64 位操作系统是编译器中的一个选项。您完全可以从 Vista 64 位中编译出 32 位 exe。运行应用程序时,您可以在任务管理器中看到进程旁边有一个 "*32",这意味着它是 32 位的 ;)

我认为您的经理需要更多关于 64 位操作系统真正含义的教育 :)


1
不是对你的问题的回答,但可能是你问题的解决方案:VirtualBox(以及可能其他软件)支持“无缝集成”模式,它只是给你一个第二个启动栏,并允许你自由拖动窗口。
另外,这是你问题的答案,它取决于你的编译设置。你可以为不同的环境编译,并且你可以使用Visual Studio在64位系统上完美地编译32位程序。我不能告诉你如何做,但我相信一些Visual Studio大牛可以帮助你。

1
我们使用VS 2005(不久将升级到2008)开发32位应用程序,并刚刚购买了一些安装有XP Pro x64或Vista Business 64位操作系统的新机器,以便利用额外的RAM,同时密切关注是否需要进行64位移植。我们在这方面没有遇到任何问题,只需在开发环境中微调一些脚本即可。
那些未包含在此次升级周期中的开发人员仍在使用32位机器,因此在提交代码之前,单元测试和应用程序测试套件运行时应该会出现问题。
我们还要确保拥有一组“测试构建”机器,由“典型”配置(XP/Vista、2/4/8核等)组成,用于构建和测试一系列检入 - 我们有各种不同的稳定性、性能等测试套件 - 在将其添加到集成区域之前。同样,这些机器也没有出现在64位操作系统上构建的32位应用程序运行时出现任何问题。
总之,正如其他人已经说过的,我不认为这会是一个问题,因为编译器会为目标操作系统生成适当的代码,而不管编译器实际运行在哪个操作系统上。

0

今天找到了这个:

http://www.brianpeek.com/blog/archive/2007/11/13/x64-development-with-net.aspx

使用.NET进行x64开发 今年早些时候,我开始使用64位操作系统 - 具体来说是Vista Ultimate x64。从大多数情况来看,这个过程相对来说还是比较顺利的,但也有一些小的问题(主要是x64兼容驱动程序,但这不是本次讨论的重点)。
在x64开发领域,有几个问题一直令人头疼,我想在这里概述一下。这个列表可能会不断增长,所以请期待未来的帖子。
在.NET开发的精彩世界中,应用程序和程序集可以编译为针对各种平台的目标。在Visual Studio中,默认情况下,应用程序和程序集都是以Any CPU编译的。在这种情况下,CLR将根据正在执行它的计算机的默认目标加载程序集。例如,在x64机器上运行可执行文件时,它将作为64位进程运行。
Visual Studio还提供了3个特定的平台目标:x86、x64和Itanium(IA-64)。当将可执行文件构建为特定的目标时,它将作为该类型的进程加载。例如,在x64机器上运行以x86为目标的可执行文件将作为32位进程使用32位CLR和WOW64层运行。在运行时加载程序集时,如果它们的目标与托管进程的目标匹配,或者编译为Any CPU,则仅能由进程加载。例如,如果将x64设置为程序集的目标,则只能由x64进程加载。
这在我的几个场景中发挥了作用:
  • XNA - XNA仅提供32位程序集。因此,在引用XNA程序集时,使用它们的可执行文件/程序集必须针对x86平台进行定位。如果以x64(或以Any CPU并在64位计算机上运行)为目标,则在尝试加载XNA程序集时会抛出错误。
  • Microsoft Robotics Studio - XInputGamepadService在内部使用XNA与Xbox 360控制器进行通信。请参见上文。
  • Managed DirectX - 尽管此项技术已经过时,并正被XNA所取代,但它仍然有其用途。程序集没有标记为特定的目标,但我在使用Microsoft.DirectX.AudioVideoPlayback程序集时遇到了一些内存异常的问题。
  • Phidgets - 根据您下载和使用的库以及时间,它可能标记为仅限32位。当前版本(11/8/07)是这样标记的,因此需要一个32位进程来托管它。 确定可执行文件或程序集是否针对特定平台的最简单方法是使用corflags应用程序。要使用它,请从“开始”菜单中打开Visual Studio命令提示符,并针对要检查的程序集运行它。
确定可执行文件或程序集是否针对特定平台的最简单方法是使用corflags应用程序。要使用它,请从“开始”菜单中打开Visual Studio命令提示符,并针对要检查的程序集运行它。

0

是的,就像Adam所说的那样。有三个选项:MSIL(默认),x64和x86。您可以针对x64进行目标设置,它将生成专门用于64位系统的dll,或者您可以选择x86,它将在32位和64位上运行,但在64位系统上将具有与32位相同的限制。

MSIL基本上会让JITer发出平台特定的指令(与本地映像相比略有性能损失)

编辑:没有语言限制,因此我正在谈论.net框架语言,如vb.net和c#,而c++则完全不同。


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