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

C#预处理器区分不同的操作系统,c#,cross-platform,c-preprocessor,C#,Cross Platform,C Preprocessor,是否可以使用预处理器来区分C中的操作系统?比如: #if OS_WINDOWS //windows methods #elif OS_MAC //mac methods #elif OS_LINUX //linux methods #endif 不,很遗憾你不能。这甚至是合乎逻辑的:如果您为AnyCPU编译,那么您的程序可以在任何平台上执行 您可以做的是创建多个项目配置,在其中设置所需的#define(在项目属性、构建、条件编译符号中) 但也许这是个问题。。。通常你不需要这样做,你可以和一个

是否可以使用
预处理器
来区分
C
中的操作系统?比如:

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

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

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

但也许这是个问题。。。通常你不需要这样做,你可以和一个

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

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

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

}

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

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


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

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

  • csproj

    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
      <DefineConstants>_WINDOWS</DefineConstants>
    </PropertyGroup>
    

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

    C#的全部要点是,您不需要为不同的平台重新编译。这就留下了PlatformID.Win32NT
    #if _WINDOWS
      // your windows stuff
    #else
      // your *nix stuff
    #endif