C#指令指示32位或64位构建
在使用开发机器(32位或64位)时,是否存在某种类型的C#指令,该指令说明了以下内容:
如果(32位Vista) //将属性设置为true 否则如果(64位Vista) //将属性设置为false
但我想在Visual Studio中这样做,因为我有一个我正在研究的应用程序需要在32/64位版本的Vista中进行测试。
这样的事情可能吗?
你能在运行时做到吗?
if (IntPtr.Size == 4) // 32 bit else if (IntPtr.Size == 8) // 64 bit
64位有两个需要注意的条件。 第一个是OS 64位,第二个是以64位运行的应用程序 。 如果您只关心应用程序本身,可以使用以下内容:
if( IntPtr.Size == 8 ) // Do 64-bit stuff else // Do 32-bit
在运行时,JIT编译器可以优化false条件,因为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位版本时。
我在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
我不确定这是否是您正在寻找的但我检查IntPtr.Size
以检测32位与64位运行时。 请注意,这可以告诉您运行时环境,您可能正在WOW64中运行
if (IntPtr.Size == 4) { //32 bit } else if (IntPtr.Size == 8) { //64 bit } else { //the future }
我知道这是一个老话题,但我最近必须达到相同的结果(即在构建时确定,而不是运行时)
我创建了新的构建配置(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
从Build
打开Configuration Manager
。 从那里,您应该能够设置Active solution platform
并创建专门针对x64,x86或任何CPU的配置。 从那里,您可以根据当前配置有条件地编译代码。
请注意,这通常是一个非常糟糕的主意。 .Net程序通常作为IL而不是本机代码分发。 然后,当用户第一次尝试运行它时,JIT编译器会在每台本地计算机上编译此IL。 通过选择默认的“任何CPU”,您可以允许JIT编译器为每台计算机进行确定。
这种情况的主要例外是当你依赖32位库时。 在这种情况下,您不希望JIT编译器为x64编译,因为它可能会破坏与库的互操作。
内置任何内容都无法为您完成此任务。 您可以随时#define
您自己的符号,并根据需要将其用于条件编译。
- 安装文件的位置 – Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5
- 为事件定义空委托主体是一个好习惯吗?
- StructureMap针对所有可能的具体实现注册generics类型
- 在C#中,VB的Asc()和Chr()函数相当于什么?
- 在Root中插入证书(带私钥),LocalMachine证书存储在.NET 4中失败
- 在Mvc.Controller中使用Server
- 为什么不能克隆IEnumerator?
- Azure云服务:“不允许请求的注册表访问”。 VS2015
- 从资源中读取文件并将其写入C#中的磁盘