可以在动态导入 dll 时加载文件或程序集

Can load file or assembly while importing dll dynamically

我正在尝试编写一个 dotnet 核心控制台程序,它动态加载指定的 dll 文件以获取出现在 dll 中的类型。

我的 dll 项目如下所示:

SignlaR 中心 class:

namespace GameServer
{
    public class MyHub : Hub
    {
    }
}

启动class:

namespace GameServer
{
    public class StartUp
    {
        public IConfiguration Configuration { get; private set; }

        public StartUp(IConfiguration config)
        {
            Configuration = config;
        }

        public void ConfigureServices(IServiceCollection services)
        {
         
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseRouting();

            app.UseAuthentication();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapHub<MyHub>("/hub");
            });
        }
    }
}

和程序 Class:

namespace GameServer
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            return WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://localhost:5005")
                .UseStartup<StartUp>();
        }
    }
}

所有这些都在同一个项目中,我构建它以生成 .dll 文件。 之后,我编写了一个 dotnet 核心控制台程序来动态包含该 dll 并获取我所拥有的 classes 类型。这是它的样子:

public class Program
    {
        public static void Main(string[] args)
        {
            var dll = Assembly.LoadFile(@"C:\Users\Dreamer\Desktop\git Repos\GameServer\bin\Debug\net5.0\GameServer.dll");
            foreach(Type type in dll.GetExportedTypes())
            {
                Console.WriteLine(type);
            }

        }
    }

但是当我运行这段代码时它抛出异常。 exception image.

这是创建信号集线器的原因class,无法获取其类型。当我删除 class 时,它完全可以正常工作。我试图在 dll 程序中从 nuget 添加那个“丢失的包”,但它仍然不起作用。此外,package-Microsoft.AspNetCore.SignalR.Core 版本 5.0(如异常所述)不存在,在 nuget 包中,此包的版本为 1.0.

我找不到任何解决方法,所以如果有人知道请告诉我。

提前致谢。

已解决:它是 .net 核心控制台程序,因此需要在 .csproj 文件中包含一些内容。原始 .dll 文件使用的是 .net core 内置的 signalr core 命名空间,它不是从 nuget 安装的,所以它使用的是本地下载的 microsoft .dlls。

在程序的 .csproj 文件中,我必须包含以下代码:

<ItemGroup>
        <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

以便两个程序都可以从同一个地方读取.dll,而原始.dll 中没有包含。