如何知道在构建中使用哪个CPU(x86、x64还是AnyCpu)?

5

我正在使用Windows 7和x64 CPU。 这是否意味着我应该始终在Visual Studio中使用“x64”选项进行编译?关于“dll”,我可以从x64应用程序中使用x86 dll吗?可能还有其他问题需要考虑吗?

4个回答

7

本文简要概述了每个选项。

以下是一个小引用:

默认设置为 Any CPU,这意味着程序集将在当前运行的 CPU 上以本机方式运行。也就是说,在 64 位机器上它将以 64 位方式运行,在 32 位机器上以 32 位方式运行。如果从 64 位应用程序中调用程序集,则它将作为 64 位程序集执行,反之亦然。

如果项目设置为 x86,则表示该项目仅旨在作为 32 位进程运行。64 位进程将无法调用已设置为 X86 的程序集。将项目设置为 x86 的原因包括依赖于仅在 32 位的本机 DLL 或假定为 32 位的本机调用。标记为 x86 的应用程序和程序集仍可在 64 位 Windows 上运行。但是它们在 WOW64 下运行。Visual Studio 本身是以这种仿真模式运行的,因为它是一个 32 位应用程序。

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


一个人怎样判断 DLL 是只有 32 位版本可用的?另外,怎样判断程序是否假定为 32 位而进行本地调用? - Dan W
@DanW,我建议你发布一个问题。在评论中问这样的问题不会有太大的帮助。 - James Hill
如果其他人也遇到了这个问题,把它放在这里会更方便。无论如何,我认为这个链接可以解决问题:https://dev59.com/43RB5IYBdhLWcg3w4bAo#2418287。 - Dan W

5

一般来说,您应该始终使用AnyCpu

如果您有特定的原因预计会出现兼容性问题,则需要选择相应的x86或x64。

如评论中所述,针对特定架构构建的dll可能需要您以特定方式构建程序集。这将是您在必要时才需要做的事情,而不是其他情况下。


当我使用AnyCpu时,应用程序由于某种原因崩溃。x86选项可以工作...可能是因为使用的dll的原因。 - Oleg Vazhnev
1
是的,例如一些 OleDbODBC 驱动程序只能在 x86 模式下工作。 - Olivier Jacot-Descombes
如果你的DLL是特定的x86或x64,请使用相应的版本。例如,我正在使用一个Oracle DB Access DLL,它是x86的,因此我需要在x86上编译。 - Brad Semrad
同意...已经看到了 Jet OLEDB 的架构限制。 - SliverNinja - MSFT

2

你编写代码、编译或构建软件(EXE、DLL等)的机器与目标平台(x86/x64/Any)无关。

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

有些情况必须使用x86或x64 - 当你在项目中使用某些(第三方?)组件/库/DLL/ActiveX等只支持32位(则使用x86)或只支持64位(则使用x64)时。


1

AnyCPU 是我通常推荐的选项。您可以在这篇 Stack Overflow 帖子中深入讨论此问题。

唯一的问题是您无法回退 - 您无法从 x86 应用程序使用 x64 程序集。AnyCPU 可以缓解这种潜在的陷阱。


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