8

在使用开发机器(32 位或 64 位)时,是否有某种 C# 指令可以使用,其效果如下:

如果(32 位 Vista)
    //设置一个属性为true
else if (64 位 Vista)
    // 将属性设置为 false

但我想在 Visual Studio 中执行此操作,因为我正在处理一个需要在 32/64 位版本的 Vista 中测试的应用程序。

这样的事情可能吗?

4

9 回答 9

13

你能在运行时做吗?

if (IntPtr.Size == 4)
  // 32 bit
else if (IntPtr.Size == 8)
  // 64 bit
于 2009-07-02T20:09:19.060 回答
11

使用 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
于 2009-07-02T20:11:11.303 回答
3

您可以使用#if指令并将值设置为编译器开关(或在项目设置中):

 #if VISTA64
     ...
 #else
     ...
 #endif

并编译:

 csc /d:VISTA64 file1.cs 

编译 64 位版本时。

于 2009-07-02T20:07:59.063 回答
2

我不确定这是否是您正在寻找的,但我检查IntPtr.Size以检测 32 位与 64 位运行时。请注意,这告诉您运行时环境,您可能在 WOW64 中运行

if (IntPtr.Size == 4)
{
    //32 bit
}
else if (IntPtr.Size == 8)
{
    //64 bit
}
else
{
    //the future
}
于 2009-07-02T20:12:11.283 回答
2

我在 C# 代码中使用的是 IntPtr.Size,它在 32 位上等于 4,在 64 位上等于 8:

string framework = (IntPtr.Size == 8) ? "Framework64" : "Framework";
于 2009-07-02T20:12:30.067 回答
2

您可以使用预定义宏在编译时设置属性

    #if (_WIN64) 
  const bool IS_64 = true;
#else
  const bool IS_64 = false;
#endif
于 2010-12-09T07:48:49.433 回答
2

我知道这是一个老话题,但我最近不得不达到相同的结果(即在构建时确定,而不是在运行时确定)

我创建了新的构建配置(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
于 2014-12-03T03:39:11.710 回答
1

从. Configuration Manager_ Build从那里您应该能够设置Active solution platform和创建专门针对 x64、x86 或任何 CPU 的配置。从那里您可以拥有根据当前配置有条件地编译的代码。

请注意,这通常是一个非常糟糕的主意。.Net 程序通常作为 IL 而不是本机代码分发。然后,当用户第一次尝试运行它时,该 IL 由每台本地机器上的 JIT 编译器编译。通过选择默认的“任何 CPU”,您允许 JIT 编译器为每台单独的机器做出决定。

主要的例外是当您依赖于 32 位库时。在这种情况下,您不希望 JIT 编译器为 x64 编译,因为它可能会破坏您与库的互操作。

于 2009-07-02T20:11:31.100 回答
0

没有任何内置功能可以为您做到这一点。如果您愿意,您始终#define可以使用自己的符号并将其用于条件编译。

于 2009-07-02T20:07:40.450 回答