Загрузка сборки и введите в .NET Core - PullRequest
2 голосов
/ 04 ноября 2019

Я пытаюсь динамически загружать сборки во время выполнения в .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}");
}

Я проверил, что типы существуют в сборках и что имена правильные, но этопроисходит сбой на нескольких пользовательских загруженных сборках.

enter image description here

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

Есть идеи, что мне здесь не хватает?

1 Ответ

3 голосов
/ 04 ноября 2019

Вам необходимо использовать имя, полное сборки, поэтому Type.GetType("Namespace.TypeName, AssemblyName").

...