在使用开发机器(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中进行测试。
这样的事情可能吗?
答案 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
自己的符号,并根据需要将其用于条件编译。