在 .NET Core 中加载程序集和类型

Loading Assembly and Type in .NET Core

我正在尝试在 .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 获得了相同的列表)。程序集已加载,但我无法获取其中包含的类型的类型引用。

知道我在这里遗漏了什么吗?

您需要使用程序集限定名,Type.GetType("Namespace.TypeName, AssemblyName")