问题
Is it possible to differentiate between operating systems in C#
using preprocessor
? like :
#if OS_WINDOWS
//windows methods
#elif OS_MAC
//mac methods
#elif OS_LINUX
//linux methods
#endif
回答1:
What you are asking for is possible but needs a bit of work.
Define a preprocessor variable in your
csproj
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' "> <DefineConstants>_WINDOWS</DefineConstants> </PropertyGroup>
Use that in your code
#if _WINDOWS // your windows stuff #else // your *nix stuff #endif
I find this technique useful when you have constants that are dependent on the OS (for example native library names)
回答2:
No. Sadly you can't. And it is even logical: if you compile for AnyCPU
, then your program is executable on any platform.
What you can do is create multiple project configurations, where you set the #define
you want (in the Properties of the project, Build, Conditional compilation symbols).
But perhaps this is a XY problem... Normally you don't need to do it, and you can live with a
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
}
else if (Environment.OSVersion.Platform == PlatformID.MacOSX)
{
}
else if (Environment.OSVersion.Platform == PlatformID.Unix)
{
}
回答3:
No - think about it, the compiler runs once, but the same binary output can be used on multiple machines.
Now you can specify any symbols you want when you compile - so you could easily compile three different times and pass in different preprocessor symbols each time.
If you don't need any compile-time changes, you can just use Environment.OSVersion to detect the operating system you're running under.
来源:https://stackoverflow.com/questions/30153797/c-sharp-preprocessor-differentiate-between-operating-systems