C#预处理器区分操作系统

时间:2015-05-10 16:30:14

标签: c# cross-platform c-preprocessor

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

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

3 个答案:

答案 0 :(得分:10)

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

  1. csproj

    中定义预处理器变量
    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
      <DefineConstants>_WINDOWS</DefineConstants>
    </PropertyGroup>
    
  2. 在您的代码中使用它

    #if _WINDOWS
      // your windows stuff
    #else
      // your *nix stuff
    #endif
    
  3. 当您拥有依赖于操作系统的常量(例如本机库名称)时,我发现此技术很有用

答案 1 :(得分:5)

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

您可以做的是创建多个项目配置,您可以在其中设置所需的#define(在项目的属性中,构建条件编译符号)。

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

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

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

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

}

答案 2 :(得分:0)

不 - 考虑一下,编译器运行一次,但可以在多台机器上使用相同的二进制输出。

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

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