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
您要求的是可能的,但是需要一些工作。
在您的计算机中定义预处理器变量 csproj
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
<DefineConstants>_WINDOWS</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)在代码中使用它
#if _WINDOWS
// your windows stuff
#else
// your *nix stuff
#endif
Run Code Online (Sandbox Code Playgroud)当您具有依赖于操作系统的常量(例如本机库名称)时,我发现此技术很有用
不,可悲,你做不到.它甚至是合乎逻辑的:如果你编译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)