【发布时间】:2009-03-11 18:51:30
【问题描述】:
我需要让我的程序确定它是针对 32 位 Windows 还是 64 位/任何 CPU 编译的。我需要根据编译选项选择不同的 COM 服务器标志。有什么想法吗?
【问题讨论】:
-
您更关心它当前是作为 32 位还是 64 位应用程序运行?
我需要让我的程序确定它是针对 32 位 Windows 还是 64 位/任何 CPU 编译的。我需要根据编译选项选择不同的 COM 服务器标志。有什么想法吗?
【问题讨论】:
在运行时检查您是否正在运行 64 位应用程序:
要查看您的进程是 64 位还是 32 位,您只需检查 IntPtr.Size 或任何其他指针类型。如果你得到 4,那么你在 32 位上运行。如果你得到 8,那么你是在 64 位上运行的。
您的进程运行的是什么类型的计算机:
您可以检查 PROCESSOR_ARCHITECTURE 环境变量以查看您是否在 x64、ia64 或 x86 机器上运行。
您的进程是否在仿真下运行:
Win32 API IsWow64Process 将告诉您是否在 x64 下运行 32 位应用程序。 Wow64 表示 windows64 上的 windows32。
与其他人发布的相反:IsWow64Process 不会告诉您您是在运行 32 位还是 64 位应用程序。在 32 位机器上,它会在运行 32 位应用程序时告诉您 FALSE,而在 64 位机器上,它会告诉您 TRUE 对于 32 位应用程序。它只会告诉您您的应用程序是否在仿真下运行。
【讨论】:
你知道Environment.Is64BitProcess吗?
判断当前运行的进程是否为64位进程。
【讨论】:
您需要 Microsoft 的 CORFLAGS 命令行应用程序。 http://msdn.microsoft.com/en-us/library/ms164699(VS.80).aspx
【讨论】:
您可以使用IsWow64Process 函数在运行时确定您的 COM 服务器是 x64 还是 win32 进程。
如果您只想在编译时知道这一点:编译器会设置 _WIN64 宏。
【讨论】:
使用GetBinaryType api函数,您将获得文件的类型
这是msdn上的api链接http://msdn.microsoft.com/en-us/library/aa364819(VS.85).aspx
结果是:
SCS_32BIT_BINARY = 32 位可执行文件
SCS_64BIT_BINARY = 64 位可执行文件
SCS_DOS_BINARY = DOS
SCS_OS216_BINARY = OS/2
SCS_WOW_BINARY = 16 位
SCS_POSIX_BINARY = 基于 POSIX
SCS_PIF_BINARY = 在 DOS 上执行的 PIF 文件
【讨论】:
【讨论】:
您可以通过设置编译时间常量来执行此操作,并根据这些常量执行#ifs 以设置一个值,您可以检查该应用程序是为哪个平台编译的。见Target platform/processor at compile time。
其他最简单的方法是检查 IntPtr.Size 属性,看看它是 4(32 位)还是 8(64 位)。
【讨论】:
虽然这似乎是一条奇怪的路线,但您可以通过检查 IntPtr.Size 来判断您是在 32 位(或 WOW64 中的 64 位)还是 64 位 .NET 代码中运行。
在 32 位/WOW64 上,IntPtr.Size 为 4。
在 64 位上,IntPtr.Size 为 8。
来源:MSDN 上的Migrating 32-bit Managed Code to 64-bit Managed Code。
【讨论】:
您可以使用预定义宏来检查编译类型
#if (_WIN64)
const bool IS_64 = true;
#else
const bool IS_64 = false;
#endif
【讨论】: