Я пытаюсь динамически загружать сборки во время выполнения в .NET Core, по сути просматривая внешнюю папку и загружая сборки оттуда. Кажется, загрузка работает нормально, но я не могу создать экземпляр загруженных типов в приложении .NET Core.
Я использую следующий код загрузки (очень базовый для технико-экономического обоснования на данный момент):
private void LoadPrivateBinAssemblies()
{
var binPath = Path.Combine(WebRoot, "PrivateBin");
if (Directory.Exists(binPath))
{
var files = Directory.GetFiles(binPath);
foreach (var file in files)
{
if (!file.EndsWith(".dll", StringComparison.CurrentCultureIgnoreCase) &&
!file.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))
continue;
try
{
var asm = AssemblyLoadContext.Default.LoadFromAssemblyPath(file);
//var asm = Assembly.LoadFrom(file);
Console.WriteLine("Additional Assembly: " + file);
}
catch (Exception ex)
{
Console.WriteLine("Failed to load private assembly: " + file);
Console.WriteLine(" " + ex.Message);
}
}
}
}
Примечание. Я использую AssemblyLoadContext.Default
для загрузки в контекст по умолчанию .NET Core, из которого я, вероятно, буду создавать новый тип.
Затем - для тестированияТеперь я явно пытаюсь создать экземпляр типа, подобного этому, в нижней части последовательности запуска Configure()
:
LoadPrivateBinAssemblies();
// this has my loaded assemblies in it
var list = AssemblyLoadContext.Default.Assemblies;
try
{
// this works
var t = Type.GetType(typeof(Startup).FullName);
// fails - Markdig is loaded and has no dependencies
var t2 = Type.GetType("Markdig.Markdown", true); // fails
// fails
var md = Type.GetType("Westwind.AspNetCore.Markdown.Markdown", true);
// never get here
md.InvokeMember("Parse", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { "**asdasd**", false, false, false });
}
catch (Exception ex)
{
Console.Log($"{ex.message}");
}
Я проверил, что типы существуют в сборках и что имена правильные, но этопроисходит сбой на нескольких пользовательских загруженных сборках.

На рисунке показан список загруженных сборок (здесь из AppDomain.GetAssemblies()
, но я получаю тот же список изAssemblyLoadContext.Default.Assemblies
). Сборки загружены, но я не могу получить ссылку на тип, содержащийся в нем.
Есть идеи, что мне здесь не хватает?