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