HAdd AssemblyResolve
обработчик событий для AppDomain.CurrentDomain
и обработка загрузки сборки, как при чтении всех байтов.
const string location = @"..\..\..\..\Dependency\bin\Debug\netcoreapp3.1\";
static void Main(string[] args)
{
var domain = AppDomain.CurrentDomain;
domain.AssemblyResolve += Domain_AssemblyResolve;
var type = Type.GetType("Dependency.DependentClass,Dependency, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
var obj = Activator.CreateInstance(type);
Console.WriteLine(obj.ToString());
}
private static Assembly Domain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var dll = $"{args.Name.Split(",")[0]}.dll";
var path = Path.Combine(location, dll);
var asm = Assembly.Load(File.ReadAllBytes(path));
return asm;
}
Примечание: необходимо указать полное имя для типа, иначе он будет выдавать ошибка. Например: "Dependency.DependentClass"
Сборка зависимостей имеет 2 зависимости: одна - Newtonsoft.Json
пакет NuGet, другая - другой проект. Bar
класс находится в другом проекте.
public class DependentClass
{
public int MyProperty { get; set; }
public string AnotherProperty { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(new Bar());
}
}
РЕДАКТИРОВАТЬ: После понижения голосов я снова посмотрел вышеупомянутое решение, и хотя оно работает, скорее всего, оно будет . net Framework
решения, а не .net Core
Таким образом, более . net Core
подобное решение заключается в использовании AssemblyLoadContext
.
Определение пользовательского контекста загрузки сборки.
public class CustomLoadContext : AssemblyLoadContext
{
private readonly AssemblyDependencyResolver resolver;
public CustomLoadContext(string mainAssemblyToLoadPath) : base(isCollectible: true)
{
resolver = new AssemblyDependencyResolver(mainAssemblyToLoadPath);
}
protected override Assembly Load(AssemblyName name)
{
Console.WriteLine("Resolving : {0}",name.FullName);
var assemblyPath = resolver.ResolveAssemblyToPath(name);
if (assemblyPath != null)
{
return Assembly.Load(File.ReadAllBytes(assemblyPath));
}
return Assembly.Load(name);
}
}
Загрузите сборку и дайте пользовательскому контексту загрузчика загрузить ее зависимости.
const string location = @"..\..\..\..\Dependency\bin\Debug\netcoreapp3.1\";
static void Main(string[] args)
{
var fullPath = Path.GetFullPath(location + "Dependency.dll");
var clx = new CustomLoadContext(fullPath); // initialize custom context
var asm = clx.LoadFromStream(new MemoryStream(File.ReadAllBytes(fullPath))); // load your desired assembly
var ins = asm.CreateInstance("Dependency.DependentClass");
Console.WriteLine(ins.ToString());
}