【问题标题】:When to target x64 in Visual Studio何时在 Visual Studio 中以 x64 为目标
【发布时间】:2012-01-16 04:57:39
【问题描述】:

我最近开始了一份新工作,我注意到每个人都在谈论的第一件事是将我们的 所有 .NET 应用程序“更新”到 x64。我最初认为这很奇怪,因为我们都知道 .NET 编译为与平台无关的 IL 并且特定的 CLR 运行代码。

进一步看,我发现 this helpful article 和 this SO post 有助于解释事情。

所以现在我知道 IL 没有改变,只有元数据基本上说在 WOW64 中运行或不在 x64 系统上运行(简而言之)。

因此,如果我在 x64 系统上,我可以指定“任何 CPU”以本地运行,但不支持 32 位 dll;我可以指定支持 32 位 dll 的“x86”(因为它们都将在 WOW64 下运行); 但我什么时候可以指定“x64”?在 x64 系统上的“任何 CPU”方案中似乎支持 64 位 dll。如果我想阻止某人在 32 位系统上运行我的应用程序或确保在尝试加载 32 位 dll 时失败?

在我看来,如果您在项目中需要担心一些第 3 方 dll,您只需需要将其设置为“任何 CPU”以外的其他值。对于不处理其他 dll 的所有其他项目,是否最好将其保留为“任何 CPU”?

如果我碰巧将目标设置为“x86”,因为我有一个 32 位 3rd 方 dll,如果在 WOW64 下的 64 位系统上,我的应用程序实际上是否被认为是在 64 位上运行的?

【问题讨论】:

  • 您不能在安装程序中忽略它。如果您有 x64 要求,则必须将安装程序的 TargetPlatform 设置设置为 x64。如果您不这样做,它将无法正确安装。由于安装程序现在已经确保 64 位操作系统可用,现在您为 EXE 项目选择什么不再重要。还不如使用 AnyCPU。

标签: .net visual-studio-2010 build 64-bit


【解决方案1】:

是的,如果您正在调用本身为 64 位的 DLL(因为它是本机的,或者是本身调用 64 位本机 DLL 的托管 DLL 等),您将指定项目应编译为 x64 .

同样,如果您正在处理 32 位 3rd 方 DLL,则指定它应该是 x86;如果在 64 位版本的 Windows 上运行,则不会被视为 64 位应用程序。

如果您只是处理纯托管代码,那么我会将其保留为“任何”。我通常也将 DLL 保留为“任意”,即使可执行文件将指定为 x86 或 x64。

即使您正在处理本机 dll,如果您使用 PInvoke,您仍然可以将其保留为“任何”;你可以有两个版本的类,一个用于 x86,一个用于 x64,并通过检查 IntPtr.Size 属性选择在运行时使用哪一个。

当然,如果您的应用程序需要超过 4 GB 的 RAM,并且您希望强制它必须在 64 位操作系统上运行,那么您还需要以 x64 为目标。

【讨论】:

  • 很多时候你可以在 32 位和 64 位上使用相同的 p/invokes
【解决方案2】:

如果您通过 COM 或没有 32 位版本的 P/Invoke 使用本机代码,则应指定 x64。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多