【问题标题】:How to use #if to decide which platform is being compiled for in C#如何使用#if 来决定在 C# 中为哪个平台编译
【发布时间】:2015-03-26 19:59:37
【问题描述】:

在 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。

【问题讨论】:

  • 你考虑过使用条件编译符号吗?可以根据目标平台在您的项目中设置它们。
  • 谢谢@QualityCatalyst,它们是自动的还是我必须设置它们?是否有设置了哪些条件符号的列表?
  • 您必须在配置中设置它们。配置非常开放,不在乎你定义什么。
  • 还要注意从@QualityCatalyst 喜欢的答案中“删除任何” - 因为“任何”可执行文件,尤其是类库可以在两个 x86/x64 进程中加载​​,你不能真正定义常量它...

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


【解决方案1】:

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

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

对于我的 Release x64 版本,我定义了一个 X64 常量,我可以像这样使用它:

#if X64

#endif

【讨论】:

    【解决方案2】:

    您也可以在 x64 平台的项目属性中只定义一个符号(例如 _x64)。打开项目的属性对话框,选择x64平台,在Build页面,将“_x64”放入“Conditional compilation symbols”框内即可。
    确保对调试和发布配置都执行此操作。

    【讨论】:

      【解决方案3】:

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

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

      但是,这种区别也可能无关紧要,具体取决于您的应用程序的需要。 .NET 管理自己的内存,没有什么可以阻止您为 x86 构建的程序集在 64 位计算机上运行。如果您与非托管代码互操作,您的库中是否有任何外部组件可以告诉您您应该使用什么大小,而不是假设?

      【讨论】:

      • 不,它不是运行时,而是在编译时。重要的是要知道我可以安全地在元素列表或数组中消耗多少内存来传递块...小于块大小的文件可以在一次传递中消耗,这使得过程更快!
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-16
        • 2011-02-17
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 2014-09-28
        • 1970-01-01
        相关资源
        最近更新 更多