【问题标题】:Targeting x86 vs AnyCPU when building for 64 bit window OSes为 64 位窗口操作系统构建时针对 x86 与 AnyCPU
【发布时间】:2010-06-01 04:24:16
【问题描述】:

我有一个为 .NET 2.0 编写的现有 C# 应用程序,目前针对 AnyCPU。它目前引用了一些我没有源代码的第三方 .NET DLL(我不确定它们是为 x86、x64 还是 AnyCPU 构建的)。

如果我想专门在 64 位 Windows 操作系统上运行我的应用程序,我应该以哪个平台为目标才能让我的应用程序无错误地运行?我目前的理解是针对:

  • x86:如果为 x86 构建了至少一个第三方 .NET dll,或者使用 p/Invoke 与 Win32 DLL 交互。应用程序将在 32 位和 64 位操作系统上以 32 位模式运行。
  • x64:如果所有第三方 .NET dll 已经为 x64 或 AnyCPU 构建。应用程序只能在 64 位操作系统中运行。
  • AnyCPU:如果所有第三方 .NET dll 都已为 AnyCPU 构建。应用程序将在 32 位操作系统上以 32 位模式运行,在 64 位操作系统上以 64 位模式运行。

另外,我是否正确地相信,虽然以 AnyCPU 为目标在构建引用第三方 x86 .NET DLL 的应用程序时不会产生错误,但当应用程序在 64 上运行时尝试加载这些 DLL 时,它会引发运行时异常位操作系统。

因此,只要我的第三方 DLL 之一正在执行 p/Invoke 或者是 x86,我就只能针对此应用程序以 x86 为目标?

【问题讨论】:

    标签: .net 64-bit


    【解决方案1】:

    您可以从 AnyCPU DLL 执行 P/Invoke,您只需对 P/Invoke 定义更加小心(即您不会无意中假设为 32 位或其他)。问题是很难知道第 3 方 DLL 是否在没有 Reflector 和反汇编的情况下做正确的事情(当然,除非开发人员特别声明支持 64 位)。

    但除此之外,你几乎是正确的。

    说实话,对于 99% 的应用程序,以 x86 为目标是完全可以接受的。实际上受益于 64 位的应用程序数量相对较少。 (性能问题通常会出现一些问题:更多的寄存器被 x86 模式的寄存器重命名和更大的数据结构所抵消,因为指针是原来的两倍 [在像 .NET 这样的引用繁重的系统中更糟])

    【讨论】:

      【解决方案2】:

      我对你问题的这个特定部分很好奇。

      另外,我是否正确地相信,虽然 以 AnyCPU 为目标将不会生成 构建应用程序时的错误 引用第三方 x86 .NET DLL, 应用程序将引发运行时 当它尝试加载这些时出现异常 在 64 位操作系统上运行时的 DLL。

      所以我试了一下。我创建了一个针对 x86 的 DLL 项目 ClassLibrary1,然后添加了一个针对 AnyCPU 的 ConsoleApplication1 并引用了另一个项目。我确保在 Main 方法中实际使用了 ClassLibrary1 项目中的一个类。

      Visual Studio 没有给我任何关于引用或构建应用程序的警告或投诉。当我运行应用程序(在 64 位操作系统上)并加载 ClassLibrary1 程序集时,我遇到了 BadImageFormatException。

      如果我将 ConsoleApplication1 更改为目标 x64,我会收到编译器警告,但编译成功,并且在运行时发生相同的异常。

      所以要回答您的问题,是的,如果您引用的程序集(或为此在运行时加载的任何程序集)也没有为 AnyCPU 编译,那么您很可能会遇到麻烦。如果您不确定,并且不需要额外的地址空间,我会坚持以 x86 为目标。如果您确定您的依赖项是为 AnyCPU 编译的,那么您可以根据需要以 AnyCPU 为目标,但请务必在两种处理器架构中进行大量测试。

      【讨论】:

      • AnyCPU 是我的 VS 实例的默认目标平台,当您除了 .NET 框架之外没有其他依赖项时,这显然没问题。一旦引入了其他依赖项,假设应用程序将继续在 64 位平台上运行,仅仅是因为应用程序针对 AnyCPU 并且编译没有问题,这将是一个痛苦的假设。感谢您的回答:)
      猜你喜欢
      • 1970-01-01
      • 2013-08-29
      • 2011-03-02
      • 1970-01-01
      • 2010-11-07
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多