32位和64位.NET应用程序有什么区别?

22

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


并不是这样,每个.NET应用程序都运行了大量的本机代码。而且有很多本机代码可以使用两种方式。操作系统是最好的例子。其次是CLR和Jitter。 - Hans Passant
4个回答

16

.NET 应用程序可以编译为 x86、x64 或 "Both" 的目标。通常,如果你依赖于另一个平台上不可用的 COM 控件,你应该只针对其中一个平台。


9

您的代码可以编译成完全独立于平台的形式,或者您可以针对特定平台进行目标设置。标准建议是将库保持架构中立(即“任何 CPU”),并将可执行文件的目标设置为 x86。Visual Studio 2010 默认采用这种方法的原因在此处解释:AnyCPU 可执行文件通常不值得麻烦

  1. 以两种非常不同的模式(x64 和 x86)运行会增加产品复杂性和测试成本。
  2. 32 位往往(稍微)更快。
  3. 某些功能在 x64 中不可用。
  4. 如果需要超过 4 GB 的地址空间,则应只针对 x64 进行目标设置,避免支持两个平台的成本。

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


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

3

是的,你说得对。纯.NET代码是跨平台的(在Visual Studio中使用“Any CPU”选项),除非引用了外部库(据我所知包括COM和P/Invokes)。如果引用了外部库,则必须与构建外部库的平台相匹配。


0

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