在C#
中,是否可以使用预处理器
区分操作系统?例如:
#if OS_WINDOWS
//windows methods
#elif OS_MAC
//mac methods
#elif OS_LINUX
//linux methods
#endif
在C#
中,是否可以使用预处理器
区分操作系统?例如:
#if OS_WINDOWS
//windows methods
#elif OS_MAC
//mac methods
#elif OS_LINUX
//linux methods
#endif
你所要求的是可行的,但需要一些工作。
在你的 csproj
中定义一个预处理器变量。
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
<DefineConstants>_WINDOWS</DefineConstants>
</PropertyGroup>
在您的代码中使用它
#if _WINDOWS
// your windows stuff
#else
// your *nix stuff
#endif
当您有依赖于操作系统的常量时(例如本地库名称),我发现这种技术很有用。
AnyCPU
,那么你的程序可以在任何平台上运行。#define
(在项目的属性,生成,条件编译符号中)。if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
}
else if (Environment.OSVersion.Platform == PlatformID.MacOSX)
{
}
else if (Environment.OSVersion.Platform == PlatformID.Unix)
{
}
<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
'$(OS)' == 'Windows_NT'
条件而不是基于IsOSPlatform
的方法。 - kol不要误解,编译器只运行一次,但是相同的二进制输出可以用于多台机器。
现在您可以在编译时指定任何符号-因此,您可以轻松地编译三次并每次传递不同的预处理器符号。
如果您不需要任何编译时更改,则可以使用Environment.OSVersion
来检测您正在运行的操作系统。
OperatingSystem
类。if (OperatingSystem.IsLinux()) // standard guard examples
{
LinuxOnlyApi();
}