如何知道在构建中使用哪个 cpu(x86 x64 或 AnyCpu)?

Posted

技术标签:

【中文标题】如何知道在构建中使用哪个 cpu(x86 x64 或 AnyCpu)?【英文标题】:how to know which cpu to use in build (x86 x64 or AnyCpu)? 【发布时间】:2012-02-09 20:33:45 【问题描述】:

我使用的是 Windows 7 和 x64 处理器。 这是否意味着我应该始终在 Visual Studio 中使用“x64”选项进行编译?那么“dll”呢,我可以使用 x64 应用程序中的 x86 dll 吗?可能还有其他顾虑?

【问题讨论】:

【参考方案1】:

This article 包含每个选项的简要概述。

这里有一个小引述:

默认设置 Any CPU 表示程序集将运行 本机在 CPU 上,它当前正在运行。意思是,它将运行 在 64 位机器上为 64 位,在 32 位机器上为 32 位。如果 从 64 位应用程序调用程序集,它将作为 64位汇编等等。

如果项目设置为 x86,这意味着该项目旨在 仅作为 32 位进程运行。 64 位进程将无法调用 到一个装配集为 X86。将项目设置为 x86 的原因 包括对仅在 32 位或假设 32 位进行本机调用。应用程序和 标记为 x86 的程序集仍然可以在 64 位 Windows 上运行。然而 他们在WOW64下运行。 Visual Studio 本身在此仿真下运行 模式,因为它是一个 32 位应用程序。

将项目设置为 x64 将指定程序集必须运行 在 64 位 Windows 下。尝试在 32 位上运行程序集 Windows 或从 32 位进程调用程序集将导致 运行时错误。

【讨论】:

如何确定 DLL 是否仅在 32 位中可用?另外,如何判断程序是否在假设 32 位的情况下进行本机调用? @DanW,我建议发布一个问题。在 cmets 中问这样的问题不会让你走得太远。 如果其他人也遇到这个问题,在这里更方便。无论如何,我认为this 会成功的。【参考方案2】:

一般来说,你应该一直使用AnyCpu

如果您有特定的理由预计会出现兼容性问题,那么您需要根据需要选择 x86 或 x64。

如 cmets 中所述,针对特定体系结构构建的 dll 可能需要您以某种方式构建程序集。这将是您需要时想要做的事情,否则不会。

【讨论】:

当我使用 AnyCpu 应用程序时由于某种原因崩溃。 x86 选项有效...可能这是因为使用了 dll .. 是的,例如,某些OleDbODBC 驱动程序只能在x86 模式下工作。 @javapowered 是的,如果您的 DLL 专门用于 x86 或 x64,请使用相应的。例如,我使用的是 x86 的 Oracle DB Access DLL,然后我需要在 x86 中编译。 同意...看到Jet OLEDB的架构限制【参考方案3】:

不...您编写代码/编译/构建软件(EXE,DLL...)的机器与目标(x86 / x64 / Any)的问题没有任何关系。

如果您希望构建结果在您使用 x86 或 AnyCPU 的任何地方运行。如果您希望结果仅在 x64 上运行,则使用 x64。

在某些情况下,您必须使用 x86 或 x64 - 也就是说,当您在项目中使用某些(第 3 方?)组件/库/DLL/ActiveX 等时,它们是仅 32 位(然后是 x86)或仅仅限 64 位(然后是 x64)。

【讨论】:

【参考方案4】:

AnyCPU 是我通常推荐的。你可以在this SO post看到这个问题的深入讨论。

唯一的问题是您不能倒退 - 您不能使用来自 x86 应用程序的 x64 程序集。 AnyCPU 缓解了这个潜在的陷阱。

【讨论】:

以上是关于如何知道在构建中使用哪个 cpu(x86 x64 或 AnyCpu)?的主要内容,如果未能解决你的问题,请参考以下文章

在“任何 CPU”.NET 程序集上强制 x86 CLR

C# IO 不适用于 x64 或仅在任何 CPU 上的 x86 配置

选择哪个 VC++ 可再发行包(x86 或 x64)?

如何将 x86 和 x64 asm 文件包含到单个 Visual Studio 项目中?

IA64与x64的区别

如何正确建立和指定的配置和平台,x64和x86