如何使用#if来决定在C#中编译哪个平台

时间:2015-01-28 02:06:24

标签: c# 32bit-64bit preprocessor-directive

在C ++中有预定义的宏:

#if defined(_M_X64) || defined(__amd64__)
    // Building for 64bit target
    const unsigned long MaxGulpSize = 1048576 * 128;// megabyte = 1048576;
    const unsigned long MaxRecsCopy = 1048576 * 16;
#else
    const unsigned long MaxGulpSize = 1048576 * 8;// megabyte = 1048576;
    const unsigned long MaxRecsCopy = 1048576;
#endif

允许我设置常量来控制将要使用的内存量。

当然我可以逐字定义预处理器变量:

#define Is64bit 1

using System;
using System.Collections.Generic;

-later -

#if Is64bit
    // Building for 64bit target
    const long MaxGulpSize = 1048576 * 128;// megabyte = 1048576;
    const long MaxRecsCopy = 1048576 * 16;
#else
    const long MaxGulpSize = 1048576 * 8;// megabyte = 1048576;
    const long MaxRecsCopy = 1048576;
#endif

我找不到基于配置管理器中设置的值来检测平台的方法,这将允许命令行构建:

set de=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe
set sol=E:\Some\Path\to\my.sln
"%de%" %sol% /build "Release|x86"
"%de%" %sol% /build "Release|x64"

有没有办法检测到这个或者我是否需要构建,更改平台并再次构建?

4 个答案:

答案 0 :(得分:11)

您可以将任何常量添加到.csproj文件中。这些可以放入条件属性组中,如下所示。

 <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    <DefineConstants>TRACE;X64</DefineConstants>
    ...
 </PropertyGroup>

对于我的Release x64版本,我已经定义了一个我可以使用的X64常量:

#if X64

#endif

答案 1 :(得分:1)

确保您的设计考虑是否需要在编译时或运行时知道这一点。如果是编译时间,那么是的,您可能需要定义一个常量。这可以通过命令行传递,或者通过配置使用Visual Studio或MSBUILD传递。更改配置并重新构建。

如果是运行时,请搜索问题的答案,例如How to know a process is 32-bit or 64-bit programmatically ...和朋友。

但是,根据您的应用需求,这种区别也可能无关紧要。 .NET管理自己的内存,没有什么能阻止你的x86组件在64位机器上运行。如果您正在使用非托管代码,那么您的库中是否有任何外部可以告诉您您应该使用的大小,而不是假设?

答案 2 :(得分:1)

您也可以在x64平台的项目属性中定义符号(例如_x64)。打开项目的属性对话框,选择x64平台,在Build页面上,只需输入&#34; _x64&#34;进入&#34;条件编译符号&#34;框。
确保为调试和发布配置执行此操作。

答案 3 :(得分:0)

在 vb.net 项目中可以使用 PLATFORM 变量

#If PLATFORM == "x86" Then
   Imports MyProxy = MyX86dll.MyClass
#Else
   Imports MyProxy = MyX64dll.MyClass
#End If