可以在动态导入 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 中没有包含。
我正在尝试编写一个 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 中没有包含。