如何使用#if 来决定在 C# 中为哪个平台编译
How to use #if to decide which platform is being compiled for in C#
在 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;
-稍后-
#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"
有没有办法检测到这一点,或者我是否必须构建、更改平台并重新构建?
更新:当 32 位 Windows 7 工作站中的最后一个退役时,32/64 位问题成为一个有争议的问题,因此不再需要为两个平台编译。我认为尽管保留此线程是值得的,因为这些概念可以帮助其他预处理器指令,例如针对 MS Office 与 Open Office。
确保您的设计考虑是否需要在编译时或运行时知道这一点。如果是编译时间,那么是的,您可能需要定义一个常量。这可以在命令行上传递,或者如果使用 Visual Studio 或 MSBUILD,则通过配置传递。更改配置并重新构建。
如果是运行时,请搜索How to know a process is 32-bit or 64-bit programmatically...和朋友等问题的答案。
但是,根据您的应用程序的需要,这种区别也可能无关紧要。 .NET 管理自己的内存,并且没有什么能阻止您在 64 位计算机上从 运行 为 x86 构建的程序集。如果您正在与非托管代码互操作,您的库中是否有任何外部组件可以告诉您您应该使用什么大小,而不是假设?
您可以将任何常量添加到 .csproj
文件中。这些可以放入有条件的 属性 组,如下所示。
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<DefineConstants>TRACE;X64</DefineConstants>
...
</PropertyGroup>
对于我的 Release x64 版本,我定义了一个 X64 常量,我可以像这样使用它:
#if X64
#endif
您也可以只在 x64 平台的项目属性中定义一个符号(例如 _x64)。打开项目的属性对话框,select x64 平台,在构建页面上,只需将“_x64”放入 "Conditional compilation symbols" 框中。
确保对调试和发布配置都执行此操作。
在 vb.net 项目中可以使用 PLATFORM 变量
#If PLATFORM == "x86" Then
Imports MyProxy = MyX86dll.MyClass
#Else
Imports MyProxy = MyX64dll.MyClass
#End If
在 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;
-稍后-
#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"
有没有办法检测到这一点,或者我是否必须构建、更改平台并重新构建?
更新:当 32 位 Windows 7 工作站中的最后一个退役时,32/64 位问题成为一个有争议的问题,因此不再需要为两个平台编译。我认为尽管保留此线程是值得的,因为这些概念可以帮助其他预处理器指令,例如针对 MS Office 与 Open Office。
确保您的设计考虑是否需要在编译时或运行时知道这一点。如果是编译时间,那么是的,您可能需要定义一个常量。这可以在命令行上传递,或者如果使用 Visual Studio 或 MSBUILD,则通过配置传递。更改配置并重新构建。
如果是运行时,请搜索How to know a process is 32-bit or 64-bit programmatically...和朋友等问题的答案。
但是,根据您的应用程序的需要,这种区别也可能无关紧要。 .NET 管理自己的内存,并且没有什么能阻止您在 64 位计算机上从 运行 为 x86 构建的程序集。如果您正在与非托管代码互操作,您的库中是否有任何外部组件可以告诉您您应该使用什么大小,而不是假设?
您可以将任何常量添加到 .csproj
文件中。这些可以放入有条件的 属性 组,如下所示。
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<DefineConstants>TRACE;X64</DefineConstants>
...
</PropertyGroup>
对于我的 Release x64 版本,我定义了一个 X64 常量,我可以像这样使用它:
#if X64
#endif
您也可以只在 x64 平台的项目属性中定义一个符号(例如 _x64)。打开项目的属性对话框,select x64 平台,在构建页面上,只需将“_x64”放入 "Conditional compilation symbols" 框中。
确保对调试和发布配置都执行此操作。
在 vb.net 项目中可以使用 PLATFORM 变量
#If PLATFORM == "x86" Then
Imports MyProxy = MyX86dll.MyClass
#Else
Imports MyProxy = MyX64dll.MyClass
#End If