using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.IO; using System.Linq; namespace Semmle.Extraction.CSharp.Standalone { /// /// Locates .NET Runtimes. /// static class Runtime { static string ExecutingRuntime => RuntimeEnvironment.GetRuntimeDirectory(); /// /// Locates .NET Core Runtimes. /// public static IEnumerable CoreRuntimes { get { string[] dotnetDirs = { "/usr/share/dotnet", @"C:\Program Files\dotnet" }; foreach (var dir in dotnetDirs.Where(Directory.Exists)) return Directory.EnumerateDirectories(Path.Combine(dir, "shared", "Microsoft.NETCore.App")). OrderByDescending(d => Path.GetFileName(d)); return Enumerable.Empty(); } } /// /// Locates .NET Desktop Runtimes. /// This includes Mono and Microsoft.NET. /// public static IEnumerable DesktopRuntimes { get { string[] monoDirs = { "/usr/lib/mono", @"C:\Program Files\Mono\lib\mono" }; if (Directory.Exists(@"C:\Windows\Microsoft.NET\Framework64")) { return System.IO.Directory.EnumerateDirectories(@"C:\Windows\Microsoft.NET\Framework64", "v*"). OrderByDescending(d => Path.GetFileName(d)); } foreach (var dir in monoDirs.Where(Directory.Exists)) { return System.IO.Directory.EnumerateDirectories(dir). Where(d => Char.IsDigit(Path.GetFileName(d)[0])). OrderByDescending(d => Path.GetFileName(d)); } return Enumerable.Empty(); } } public static IEnumerable Runtimes { get { foreach (var r in CoreRuntimes) yield return r; foreach (var r in DesktopRuntimes) yield return r; // A bad choice if it's the self-contained runtime distributed in odasa dist. yield return ExecutingRuntime; } } } }