82 lines
2.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|