dotnet-installer/src/Microsoft.DotNet.Cli.Utils/Muxer.cs

82 lines
2.2 KiB
C#

using System;
using System.IO;
using System.Reflection;
namespace Microsoft.DotNet.Cli.Utils
{
public class Muxer
{
public static readonly string MuxerName = "dotnet";
private static readonly string s_muxerFileName = MuxerName + Constants.ExeSuffix;
private string _muxerPath;
public string MuxerPath
{
get
{
if (_muxerPath == null)
{
throw new InvalidOperationException("Unable to locate dotnet multiplexer");
}
return _muxerPath;
}
}
public Muxer()
{
if (!TryResolveMuxerFromParentDirectories())
{
TryResolverMuxerFromPath();
}
}
public static string GetDataFromAppDomain(string propertyName)
{
var appDomainType = typeof(object).GetTypeInfo().Assembly?.GetType("System.AppDomain");
var currentDomain = appDomainType?.GetProperty("CurrentDomain")?.GetValue(null);
var deps = appDomainType?.GetMethod("GetData")?.Invoke(currentDomain, new[] { propertyName });
return deps as string;
}
private bool TryResolveMuxerFromParentDirectories()
{
var fxDepsFile = GetDataFromAppDomain("FX_DEPS_FILE");
if (string.IsNullOrEmpty(fxDepsFile))
{
return false;
}
var muxerDir = new FileInfo(fxDepsFile).Directory?.Parent?.Parent?.Parent;
if (muxerDir == null)
{
return false;
}
var muxerCandidate = Path.Combine(muxerDir.FullName, s_muxerFileName);
if (!File.Exists(muxerCandidate))
{
return false;
}
_muxerPath = muxerCandidate;
return true;
}
private bool TryResolverMuxerFromPath()
{
var muxerPath = Env.GetCommandPath(MuxerName, Constants.ExeSuffix);
if (muxerPath == null || !File.Exists(muxerPath))
{
return false;
}
_muxerPath = muxerPath;
return true;
}
}
}