【问题标题】:C# preprocessor differentiate between operating systemsC#预处理器区分操作系统
【发布时间】:2015-07-21 03:19:33
【问题描述】:

是否可以使用preprocessor 区分C# 中的操作系统?喜欢:

#if OS_WINDOWS
//windows methods
#elif OS_MAC
//mac  methods
#elif OS_LINUX
//linux methods
#endif

【问题讨论】:

  • C# 的全部意义在于你不需要为不同的平台重新编译。

标签: c# cross-platform c-preprocessor


【解决方案1】:

没有。可悲的是你不能。这甚至是合乎逻辑的:如果你为AnyCPU 编译,那么你的程序可以在任何平台上执行。

你可以做的是创建多个项目配置,在其中设置你想要的#define(在项目的Properties中,Build,Conditional编译符号)。

但也许这是一个XY 问题...通常你不需要这样做,你可以忍受

if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{

}
else if (Environment.OSVersion.Platform == PlatformID.MacOSX)
{

}
else if (Environment.OSVersion.Platform == PlatformID.Unix)
{

}

【讨论】:

  • 这会留下 PlatformID.Win32NT
【解决方案2】:

您的要求是可能的,但需要一些工作。

  1. 在 csproj 中定义一个预处理器变量

    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
      <DefineConstants>_WINDOWS</DefineConstants>
    </PropertyGroup>
    
  2. 在你的代码中使用它

    #if _WINDOWS
      // your windows stuff
    #else
      // your *nix stuff
    #endif
    

当您有依赖于操作系统的常量(例如本机库名称)时,我发现这种技术很有用

【讨论】:

    【解决方案3】:

    不是——想想看,编译器运行一次,但是相同的二进制输出可以在多台机器上使用。

    现在您可以在编译时指定任何您想要的符号 - 这样您就可以轻松地编译三个不同的时间并每次传递不同的预处理器符号。

    如果您不需要任何编译时更改,您可以使用Environment.OSVersion 来检测您正在运行的操作系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 2016-03-20
      • 2012-04-06
      • 2017-01-25
      • 2016-05-16
      相关资源
      最近更新 更多