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

问题描述 投票:0回答:5

是否可以使用

C#
来区分
preprocessor
中的操作系统?喜欢:

#if OS_WINDOWS
//windows methods
#elif OS_MAC
//mac  methods
#elif OS_LINUX
//linux methods
#endif
c# cross-platform c-preprocessor
5个回答
56
投票

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

  1. 在您的

    csproj

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

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

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


17
投票

不。遗憾的是你不能。这甚至是合乎逻辑的:如果您针对

AnyCPU
进行编译,那么您的程序就可以在任何平台上执行。

您可以做的是创建多个项目配置,在其中设置您想要的

#define
(在项目的属性中,构建条件编译符号)。

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

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

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

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

}

13
投票

自 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>

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

#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

2
投票

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

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

如果您不需要任何编译时更改,您只需使用

Environment.OSVersion
来检测您正在运行的操作系统。


0
投票

截至 2023 年,在运行时保护操作系统特定代码的推荐方法是使用

OperatingSystem
类:

if (OperatingSystem.IsLinux()) // standard guard examples
{
    LinuxOnlyApi();
}
© www.soinside.com 2019 - 2024. All rights reserved.