Skip to content

Detecting OS/Target when building .Net Core project (Useful when you need to DllImport different lib name by OS).

Notifications You must be signed in to change notification settings

Balnian/TestOSDetectCore2.0

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TestOSDetectCore2.0

Detecting OS/Target when building .Net Core project (Useful when you need to DllImport different lib name by OS). Only add the following to your .csproj

<!-- OS Detection default Value  -->
  <PropertyGroup>
    <IsWindows>False</IsWindows>
    <IsOSX>False</IsOSX>
    <IsAndroid>False</IsAndroid>
    <IsLinux>False</IsLinux>
  </PropertyGroup>

  <!-- Check if we target Windows -->
  <PropertyGroup Condition="($(RuntimeIdentifier.StartsWith('win')) And !$(RuntimeIdentifier.Equals('')) ) Or ( $(OS.Equals('Windows_NT')) And $(RuntimeIdentifier.Equals('')) ) ">
    <!--Replacing '-' and '.' by '_' in Constants because we cannot use those characters in the source files -->
    <DefineConstants>_WINDOWS_, $(RuntimeIdentifier.Replace("-","_").Replace(".","_"))</DefineConstants>
    <IsWindows>True</IsWindows>
  </PropertyGroup>

  <!-- Check if we target OSX -->
  <PropertyGroup Condition="($(RuntimeIdentifier.StartsWith('osx')) And !$(RuntimeIdentifier.Equals('')) ) Or ( $([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX))) And $(RuntimeIdentifier.Equals('')) ) ">
    <!--Replacing '-' and '.' by '_' in Constants because we cannot use those characters in the source files -->
    <DefineConstants>_OSX_, $(RuntimeIdentifier.Replace("-","_").Replace(".","_"))</DefineConstants>
    <IsOSX>True</IsOSX>
  </PropertyGroup>

  <!-- Check if we target Android (Doesn't Detect properly for now but is Official: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog) -->
  <!-- (Less check to do because we consider we cannot Dev on Android and anyway there's no way to detect an Android Platform other then the RID) -->
  <PropertyGroup Condition="$(RuntimeIdentifier.StartsWith('android')) ">
    <!--Replacing '-' and '.' by '_' in Constants because we cannot use those characters in the source files -->
    <DefineConstants>_ANDROID_, $(RuntimeIdentifier.Replace("-","_").Replace(".","_"))</DefineConstants>
    <IsAndroid>True</IsAndroid>
  </PropertyGroup>

  <!-- Check if we target Linux (To many name to check, instead we check if not one of the other OS) -->
  <PropertyGroup Condition=" !$(IsWindows) And !$(IsOSX) And !$(IsAndroid)">
    <!--Replacing '-' and '.' by '_' in Constants because we cannot use those characters in the source files -->
    <DefineConstants>_LINUX_, $(RuntimeIdentifier.Replace("-","_").Replace(".","_"))</DefineConstants>
    <IsLinux>True</IsLinux>
  </PropertyGroup>

And then you can detect the OS you are running on with C# preprocessor directives

static void Main(string[] args)
        {
#if _WINDOWS_
            Console.WriteLine("_WINDOWS_");

#if (_WINDOWS_ == win10_x64)

            Console.WriteLine("win10_x64");
#endif
#elif _OSX_
            Console.WriteLine("_OSX_");

#elif _LINUX_
            Console.WriteLine("_LINUX_");
#if _LINUX_ == ubuntu_14_04_x64
            Console.WriteLine("ubuntu_14_04_x64");
#elif _LINUX_ == ubuntu_16_04_x64
            Console.WriteLine("ubuntu_16_04_x64");
#endif
#elif _ANDROID_ 
            /* Doesn't Detect properly for now but is Official: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog */
            Console.WriteLine("_ANDROID_");
#endif

        }

About

Detecting OS/Target when building .Net Core project (Useful when you need to DllImport different lib name by OS).

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages