【问题标题】:Is there a difference between a 32-bit .NET application and a 64-bit .NET application?32 位 .NET 应用程序和 64 位 .NET 应用程序之间有区别吗?
【发布时间】:2012-09-26 13:02:27
【问题描述】:

我的理解是 .NET 应用程序是独立于平台的,因此纯 .NET 代码应该在 x86 或 64 位机器上运行。除非您的 .NET 代码调用一些本机代码,否则它是平台相关的。这是真的吗?

【问题讨论】:

  • 并非如此,每个 .NET 应用程序都运行大量本机代码。并且有很多本机代码在这两种风格中都可用。操作系统就是最好的例子。其次是CLR和jitter。

标签: c# .net


【解决方案1】:

.NET 应用程序可以编译为面向 x86、x64 或“两者”。通常,如果您依赖的 COM 控件不适用于其他平台等,您将只针对一个平台。

【讨论】:

    【解决方案2】:

    您的代码可以编译为完全独立于平台,或者您可以针对特定平台。标准建议是让库与体系结构无关(即“任何 CPU”)并针对可执行文件以 x86 为目标。 Visual Studio 2010 默认使用这种方法的原因在这里解释:AnyCPU executables are usually more trouble than they're worth:

    1. 以两种截然不同的模式(x64 和 x86)运行会增加产品复杂性和测试成本。
    2. 无论如何,32 位往往(有点)更快。
    3. 某些功能在 x64 中不可用。
    4. 如果超过 4 GB 的地址空间有用,正确的做法是 x64 并避免支持两个平台的成本。

    当然,如果您只针对 x86,那么您的代码仍然可以通过WoW64 在 x64 上运行。

    【讨论】:

    • 我对可执行文件的默认行为感到非常困惑。目标是 x86?
    • 是的,可执行文件以 x86 为目标。在VS2010中新建一个解决方案,然后添加一个控制台应用程序、一个Windows Forms应用程序、一个WPF应用程序和一个类库。如果然后查看配置管理器(右键单击解决方案,它在上下文菜单中),您会看到应用程序都配置为 x86,而类库设置为 AnyCPU。如果您不小心创建了 AnyCPU 构建(就像我几个月前所做的那样),这可能会特别烦人 - 您的可执行文件将不会被构建,因为默认情况下它们没有针对 AnyCPU 的有效配置。
    • x86 表示严格编译为 32 位,x64 表示严格编译为 64 位,AnyCPU 表示在 32 位操作系统上编译 32 位,在 64 位操作系统上编译 64 位。如果您对 COM/PInvoke 进行任何调用,则需要针对正确的拱门,因为 COM/PInvoke 使用指针而不是引用。我可能有点偏离,但这是一般的想法。附言64 位可以访问额外的 CPU 寄存器,因此代码可能会更快,并且可以在 1 个周期内计算所有 64 位整数。所以任何 Int64 变量都会运行得更快。
    • @Bengie Plus 如果您有大量内存需求,您可能需要 x64 - 尽管在大多数情况下您可能会遇到内存泄漏 ;)
    【解决方案3】:

    是的,你说的是真的。纯 .NET 代码是平台无关的(Visual Studio 中的“任何 CPU”),除非使用外部库(据我所知 COM 和 P/Invokes)。那么您的平台必须与用于构建外部库的平台相匹配。

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 2011-04-02
      • 1970-01-01
      • 2011-10-27
      • 2010-11-07
      • 2011-03-03
      • 2023-03-03
      • 1970-01-01
      • 2012-07-04
      • 2010-12-11
      相关资源
      最近更新 更多