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

Aba*_*oub 7 c# cross-platform c-preprocessor

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

#if OS_WINDOWS
//windows methods
#elif OS_MAC
//mac  methods
#elif OS_LINUX
//linux methods
#endif
Run Code Online (Sandbox Code Playgroud)

kol*_*kol 15

从 MSBuild 15 开始,有一个属性函数IsOSPlatform()

它可用于在项目文件 (*.csproj) 中定义特定于操作系统的常量:

<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('Windows'))">
  <DefineConstants>OS_WINDOWS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('Linux'))">
  <DefineConstants>OS_LINUX</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('FreeBSD'))">
  <DefineConstants>OS_FREEBSD</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('OSX'))">
  <DefineConstants>OS_MAC</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

可以在预处理器指令中检查这些常量,例如:

#if OS_WINDOWS
  // Windows-specific code
#elif OS_LINUX
  // Linux-specific code
#elif OS_FREEBSD
  // FreeBSD-specific code
#elif OS_MAC
  // Mac-specific code
#endif
Run Code Online (Sandbox Code Playgroud)


小智 14

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

  1. 在您的计算机中定义预处理器变量 csproj

    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
      <DefineConstants>_WINDOWS</DefineConstants>
    </PropertyGroup>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在代码中使用它

    #if _WINDOWS
      // your windows stuff
    #else
      // your *nix stuff
    #endif
    
    Run Code Online (Sandbox Code Playgroud)

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


xan*_*tos 5

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

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

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

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

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

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

}
Run Code Online (Sandbox Code Playgroud)