C#指令指示32位或64位构建

时间:2009-07-02 20:05:11

标签: c# visual-studio-2008

在使用开发机器(32位或64位)时,是否存在某种C#指令,该指令说明了以下内容:

if (32-bit Vista)
    // set a property to true
else if (64-bit Vista)
    // set a property to false

但是我想在Visual Studio中这样做,因为我有一个我正在研究的应用程序需要在32/64位版本的Vista中进行测试。

这样的事情可能吗?

9 个答案:

答案 0 :(得分:13)

你能在运行时做到吗?

if (IntPtr.Size == 4)
  // 32 bit
else if (IntPtr.Size == 8)
  // 64 bit

答案 1 :(得分:11)

64位有两个需要注意的条件。首先是 OS 64位,其次是以64位运行的应用程序。如果您只关心应用程序本身,可以使用以下内容:

if( IntPtr.Size == 8 )
   // Do 64-bit stuff
else
   // Do 32-bit

在运行时,JIT编译器可以优化false条件,因为IntPtr.Size属性是常量。

顺便说一句,要检查 OS 是否为64位,我们使用以下

if( Environment.GetEnvironmentVariable( "PROCESSOR_ARCHITEW6432" ) != null )
    // OS is 64-bit;
else
    // OS is 32-bit

答案 2 :(得分:3)

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

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

并编译:

 csc /d:VISTA64 file1.cs 

编译64位版本时。

答案 3 :(得分:2)

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

if (IntPtr.Size == 4)
{
    //32 bit
}
else if (IntPtr.Size == 8)
{
    //64 bit
}
else
{
    //the future
}

答案 4 :(得分:2)

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

string framework = (IntPtr.Size == 8) ? "Framework64" : "Framework";

答案 5 :(得分:2)

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

    #if (_WIN64) 
  const bool IS_64 = true;
#else
  const bool IS_64 = false;
#endif

答案 6 :(得分: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

答案 7 :(得分:1)

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

请注意,这通常是一个非常糟糕的主意。 .Net程序通常以IL而不是本机代码的形式分发。然后,当用户第一次尝试运行它时,JIT编译器会在每台本地计算机上编译此IL。通过选择默认的“任何CPU”,您可以允许JIT编译器为每台计算机进行确定。

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

答案 8 :(得分:0)

内置任何内容都无法为您完成此操作。您可以始终#define自己的符号,并根据需要将其用于条件编译。