C# preprocessor differentiate between operating systems

前端 未结 3 1382
甜味超标
甜味超标 2020-12-31 05:21

Is it possible to differentiate between operating systems in C# using preprocessor? like :

#if OS_WINDOWS
//windows methods
#elif O         


        
相关标签:
3条回答
  • 2020-12-31 06:03

    What you are asking for is possible but needs a bit of work.

    1. Define a preprocessor variable in your csproj

      <PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
        <DefineConstants>_WINDOWS</DefineConstants>
      </PropertyGroup>
      
    2. 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)

    0 讨论(0)
  • 2020-12-31 06:20

    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.

    0 讨论(0)
  • 2020-12-31 06:24

    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)
    {
    
    }
    
    0 讨论(0)
提交回复
热议问题