Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指示32位或64位构建的C#指令_C#_Visual Studio 2008 - Fatal编程技术网

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

指示32位或64位构建的C#指令,c#,visual-studio-2008,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 if(32位Vista) //将属性设置为true else if(64位Vista) //将属性设置为false 但我想在VisualStudio中这样做,因为我正在开发一个应用程序,需要在32/64位版本的Vi

在使用开发机器(32位或64位)时,是否有某种C#指令可供使用,该指令的作用是:

if (32-bit Vista) // set a property to true else if (64-bit Vista) // set a property to false if(32位Vista) //将属性设置为true else if(64位Vista) //将属性设置为false 但我想在VisualStudio中这样做,因为我正在开发一个应用程序,需要在32/64位版本的Vista中进行测试


这样做可能吗?

内置的任何东西都无法为您做到这一点。如果愿意,您可以始终使用自己的符号并将其用于条件编译。

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

并使用以下工具进行编译:

 csc /d:VISTA64 file1.cs 

编译64位版本时。

您能在运行时执行吗

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

构建
打开
配置管理器
。从那里,您应该能够设置
活动解决方案平台
,并创建专门针对x64、x86或任何CPU的配置。从那里您可以得到基于当前配置有条件编译的代码

但请注意,这通常是一个非常糟糕的主意。Net程序通常作为IL而不是本机代码分发。然后,当用户第一次尝试运行该IL时,JIT编译器会在每个本地机器上编译该IL。通过保留默认的“anycpu”选项,您可以让JIT编译器为每台机器做出该决定


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

我不确定这是否是您要查找的,但我检查
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

实际上,在64位模式下为“任何CPU”编译会阻止您部署到32位模式,除非MS在VS2008中修复了此错误。。。但上次我试过,你必须指定32位。@Neil:我所有的开发都是在64位机器上进行的,从来没有见过这个问题。从MS MVP:“问题在于部署。MSI文件/部署项目需要针对一个平台。这意味着,如果需要x86/x64部署,只需编译一次DLL,然后构建两个部署项目。此模式也适用于合并模块等。“事实上,我会说问题比他在那里说的更广泛。。但并非所有人都会遇到这些问题。这仍然只适用于明确针对特定平台的情况。程序集仍然以任何CPU为目标。MSI项目可能指定32/64位。实际上,MSI可以是32位的,安装后应用程序仍将运行64位。
#if BUILD64
// 64 Bit version
// do stuff here
#endif

#if BUILD32
// 32 Bit version
// do different stuff here
#endif