在使用开发机器(32 位或 64 位)时,是否有某种 C# 指令可以使用,其效果如下:
如果(32 位 Vista) //设置一个属性为true else if (64 位 Vista) // 将属性设置为 false
但我想在 Visual Studio 中执行此操作,因为我正在处理一个需要在 32/64 位版本的 Vista 中测试的应用程序。
这样的事情可能吗?
在使用开发机器(32 位或 64 位)时,是否有某种 C# 指令可以使用,其效果如下:
如果(32 位 Vista) //设置一个属性为true else if (64 位 Vista) // 将属性设置为 false
但我想在 Visual Studio 中执行此操作,因为我正在处理一个需要在 32/64 位版本的 Vista 中测试的应用程序。
这样的事情可能吗?
你能在运行时做吗?
if (IntPtr.Size == 4)
// 32 bit
else if (IntPtr.Size == 8)
// 64 bit
使用 64 位需要注意两个条件。首先是64 位操作系统,其次是 64 位运行的应用程序。如果您只关心应用程序本身,您可以使用以下内容:
if( IntPtr.Size == 8 )
// Do 64-bit stuff
else
// Do 32-bit
在运行时,JIT 编译器可以优化掉错误条件,因为 IntPtr.Size 属性是常量。
顺便说一下,要检查操作系统是否为 64 位,我们使用以下命令
if( Environment.GetEnvironmentVariable( "PROCESSOR_ARCHITEW6432" ) != null )
// OS is 64-bit;
else
// OS is 32-bit
您可以使用#if
指令并将值设置为编译器开关(或在项目设置中):
#if VISTA64
...
#else
...
#endif
并编译:
csc /d:VISTA64 file1.cs
编译 64 位版本时。
我不确定这是否是您正在寻找的,但我检查IntPtr.Size
以检测 32 位与 64 位运行时。请注意,这告诉您运行时环境,您可能在 WOW64 中运行
if (IntPtr.Size == 4)
{
//32 bit
}
else if (IntPtr.Size == 8)
{
//64 bit
}
else
{
//the future
}
我在 C# 代码中使用的是 IntPtr.Size,它在 32 位上等于 4,在 64 位上等于 8:
string framework = (IntPtr.Size == 8) ? "Framework64" : "Framework";
您可以使用预定义宏在编译时设置属性
#if (_WIN64)
const bool IS_64 = true;
#else
const bool IS_64 = false;
#endif
我知道这是一个老话题,但我最近不得不达到相同的结果(即在构建时确定,而不是在运行时确定)
我创建了新的构建配置(x86 调试、x86 发布、x64 调试、x64 发布),并在每个配置的应用程序属性的“条件编译符号”框中设置了 BUILD64 或 BUILD32。
当我需要在构建之间做一些不同的事情时(例如从 .dll 更改某些 x86 导出方法的签名),然后我使用标准构建指令来实现我所需要的。例如:
#if BUILD64
// 64 Bit version
// do stuff here
#endif
#if BUILD32
// 32 Bit version
// do different stuff here
#endif
从. Configuration Manager
_ Build
从那里您应该能够设置Active solution platform
和创建专门针对 x64、x86 或任何 CPU 的配置。从那里您可以拥有根据当前配置有条件地编译的代码。
请注意,这通常是一个非常糟糕的主意。.Net 程序通常作为 IL 而不是本机代码分发。然后,当用户第一次尝试运行它时,该 IL 由每台本地机器上的 JIT 编译器编译。通过选择默认的“任何 CPU”,您允许 JIT 编译器为每台单独的机器做出决定。
主要的例外是当您依赖于 32 位库时。在这种情况下,您不希望 JIT 编译器为 x64 编译,因为它可能会破坏您与库的互操作。
没有任何内置功能可以为您做到这一点。如果您愿意,您始终#define
可以使用自己的符号并将其用于条件编译。