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;
}
}
}
}