91 lines
1.9 KiB
C#
91 lines
1.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
|
|
namespace AxCopilot.Services;
|
|
|
|
public static class RuntimeDetector
|
|
{
|
|
private static Dictionary<string, bool>? _cache;
|
|
|
|
private static DateTime _cacheTime;
|
|
|
|
private static readonly TimeSpan CacheTtl = TimeSpan.FromMinutes(5.0);
|
|
|
|
public static bool IsAvailable(string runtime)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(runtime))
|
|
{
|
|
return true;
|
|
}
|
|
runtime = runtime.Trim().ToLowerInvariant();
|
|
if (_cache != null && DateTime.UtcNow - _cacheTime < CacheTtl)
|
|
{
|
|
if (_cache.TryGetValue(runtime, out var value))
|
|
{
|
|
return value;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_cache = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
|
|
_cacheTime = DateTime.UtcNow;
|
|
}
|
|
bool flag = DetectRuntime(runtime);
|
|
_cache[runtime] = flag;
|
|
return flag;
|
|
}
|
|
|
|
public static void ClearCache()
|
|
{
|
|
_cache = null;
|
|
}
|
|
|
|
private static bool DetectRuntime(string runtime)
|
|
{
|
|
string value = RunQuick("where.exe", runtime);
|
|
if (string.IsNullOrEmpty(value))
|
|
{
|
|
return false;
|
|
}
|
|
if (1 == 0)
|
|
{
|
|
}
|
|
string text = ((!(runtime == "java")) ? "--version" : "-version");
|
|
if (1 == 0)
|
|
{
|
|
}
|
|
string args = text;
|
|
string value2 = RunQuick(runtime, args);
|
|
return !string.IsNullOrEmpty(value2);
|
|
}
|
|
|
|
private static string? RunQuick(string exe, string args)
|
|
{
|
|
try
|
|
{
|
|
ProcessStartInfo startInfo = new ProcessStartInfo(exe, args)
|
|
{
|
|
RedirectStandardOutput = true,
|
|
RedirectStandardError = true,
|
|
UseShellExecute = false,
|
|
CreateNoWindow = true
|
|
};
|
|
using Process process = Process.Start(startInfo);
|
|
if (process == null)
|
|
{
|
|
return null;
|
|
}
|
|
string text = process.StandardOutput.ReadToEnd();
|
|
string text2 = process.StandardError.ReadToEnd();
|
|
process.WaitForExit(5000);
|
|
string text3 = (string.IsNullOrWhiteSpace(text) ? text2 : text);
|
|
return string.IsNullOrWhiteSpace(text3) ? null : text3.Trim();
|
|
}
|
|
catch
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|