64 位应用程序64-bit Applications

本文内容

编译应用程序时,您可以将其指定为在 Windows 64 位操作系统上作为本机应用程序或在 WOW64(Windows 64 位下的 Windows 32 位)下运行。WOW64 是一种兼容性环境,它使 32 位应用能够在 64 位系统上运行。WOW64 包括在所有 64 位版本的 Windows 操作系统中。

在 Windows 上运行 32 位与64 位应用程序Running 32-bit vs. 64-bit Applications on Windows

在 64 位操作系统上,所有基于 .NET Framework 1.0 或 1.1 生成的应用程序都会被视为 32 位应用程序,并始终在 WOW64 和 32 位公共语言运行时 (CLR) 下执行。基于 .NET Framework 4 或更高版本生成的 32 位应用程序也可以在 64 位系统上的 WOW64 下运行。

在 x86 计算机上,Visual Studio 会安装 32 位版本的 CLR,而在 64 位 Windows 计算机上会同时安装 32 位版本和适当的 64 位版本的 CLR。(因为 Visual Studio 是一个 32 位应用程序,所以当安装到 64 位系统上时,它会在 WOW64 下运行。)

备注

由于 Itanium 处理器系列的 x86 仿真和 WOW64 子系统设计,仅限在一个处理器上执行应用程序。这些因素会降低在基于 Itanium 的系统上运行的 32 位 .NET Framework 应用程序的性能和可伸缩性。我们建议你使用 .NET Framework 4,它包括对基于 Itanium 的系统的本机 64 位支持,以提升性能和可伸缩性。

默认情况下,在 64 位 Windows 操作系统上运行 64 位托管应用程序时,您可以创建一个不超过 2 GB 的对象。然而,在 .NET Framework 4.5 中,你可以增加该限制。有关详细信息,请参阅 <gcAllowVeryLargeObjects> 元素

很多程序集可在 32 位 CLR 和 64 位 CLR 上同样运行。然而,因为包含下列一个或多个原因,对于不同的 CLR,有些程序可能会有不同表现:

  • 结构中包含大小随平台而改变的成员,例如任何指针类型。

  • 指针算术包含固定大小。

  • 平台调用错误,或使用句柄的 Int32 而非 IntPtr 的 COM 声明不正确。

  • IntPtr 转换到 Int32 的代码。

有关如何移植 32 位应用程序以使其在 64 位 CLR 上运行的详细信息,请参阅将 32 位托管代码迁移至 64 位)。

常规 64 位编程信息General 64-Bit Programming Information

有关 64 位编程的常规信息,请参阅以下文档:

创建 64 位应用程序的编译器支持Compiler Support for Creating 64-Bit Applications

默认情况下,如果您使用 .NET Framework 在 32 位或 64 位计算机中生成一个应用程序,该应用程序将会在 64 位计算机中作为本机应用程序运行(即不是在 WOW64 下运行)。有关如何使用 Visual Studio 编译器创建 64 位应用程序,并且应用程序会作为本机应用程序运行和/或在 WOW64 下运行的信息,请参阅下表中的文档。

编译器编译器选项
Visual Basic/platform (Visual Basic)
Visual C#/platform(C# 编译器选项)
Visual C++可以通过使用 /clr:safe 创建与平台无关的 Microsoft 中间语言 (MSIL) 应用程序。有关详细信息,请参阅 /clr(公共语言运行时编译)Visual c++ 为每个 64 位操作系统均包括一个单独的编译器。有关如何使用 Visual C++ 创建可在 64 位 Windows 操作系统上运行的本机应用程序的详细信息,请参阅 64 位编程

确定 .exe 文件或 .dll 文件的状态Determining the Status of an .exe File or .dll File

若要确定 .exe 文件或 .dll 文件是只能在特定平台上运行还是可在 WOW64 下运行,请使用不带任何选项的 CorFlags.exe(CorFlags 转换工具)您也可以使用 CorFlags.exe 更改 .exe 文件或 .dll 文件的平台状态。Visual Studio 程序集的 CLR 头的主运行时版本号设置为 2,次运行时版本号设置为 5。将次运行时版本设置为 0 的应用程序会被视为旧版应用程序,且始终在 WOW64 下执行。

若要以编程方式查询 .exe 或 .dll,以查看其是只能在特定平台上运行还是在 WOW64 下运行,请使用 Module.GetPEKind 方法。