热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

动态加载ASP.NET核心程序集

如何解决《动态加载ASP.NET核心程序集》经验,求助如何解决?

我试图动态加载包含ASP.NET Core Startup类的.NET Core DLL .然后我想实例化Startup该类并将其交给TestHostAPI,因此我可以在内存中启动该站点.我写了以下代码:

var directoryPath = @"C:\Dlls";
var assemblyFilePath = Path.Combine(directoryPath, "Foo.dll");
var assemblyName = AssemblyLoadContext.GetAssemblyName(assemblyFilePath);
var assembly = new AssemblyLoader(directoryPath).LoadFromAssemblyName(assemblyName);
var startupType = assembly.ExportedTypes
    .FirstOrDefault(x => string.Equals(x.Name, "Startup"));
var webHostBuilder = new WebHostBuilder()
    .UseStartup(startupType)
    .UseUrls(new string[] { "http://localhost" });
using (var testServer = new TestServer(webHostBuilder))
{
    var respOnse= testServer.CreateClient().GetAsync("/");
}

public class AssemblyLoader : AssemblyLoadContext
{
    private readonly string directoryPath;

    public AssemblyLoader(string directoryPath) =>
        this.directoryPath = directoryPath;

    protected override Assembly Load(AssemblyName assemblyName)
    {
        var dependencyCOntext= DependencyContext.Default;
        var compilatiOnLibraries= dependencyContext
            .CompileLibraries
            .Where(x => x.Name.Contains(assemblyName.Name))
            .ToList();
        if (compilationLibraries.Count > 0)
        {
            return Assembly.Load(new AssemblyName(compilationLibraries.First().Name));
        }
        else
        {
            var file = new FileInfo($"{this.directoryPath}{Path.DirectorySeparatorChar}{assemblyName.Name}.dll");
            if (File.Exists(file.FullName))
            {
                var asemblyLoader = new AssemblyLoader(file.DirectoryName);
                return asemblyLoader.LoadFromAssemblyPath(file.FullName);
            }
        }

        return Assembly.Load(assemblyName);
    }
}

然而,这将引发一个TypeLoadExceptionassembly.ExportedTypes被调用.完整堆栈跟踪:

发生System.TypeLoadException HResult = 0x80131522
Message =方法'Foo.Startup'中的方法'ConfigureServices'来自程序集'Foo,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'没有实现.Source = StackTrace:System.Reflection.RuntimeAssembly上的System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly,ObjectHandleOnStack retTypes).GetExportedTypes()

我认为加载ASP.NET Core和其他第三方DLL(如Newtonsoft.Json)时遇到问题.


推荐阅读
author-avatar
zvan
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有