.NET Core项目上传WBAPI生成的DLL需实现加载及接口注入的技术咨询
.NET Core 动态加载WBAPI生成的DLL并注入接口服务
核心实现步骤
- 上传WBAPI生成的DLL时,需完成接口服务注入
- 在已运行的.NET Core项目中,通过接口上传DLL,实现DLL动态加载及方法接口注入
1. 上传接口实现(接收DLL文件)
编写API接口接收上传的DLL并保存到指定目录:
[ApiController] [Route("api/dll")] public class DllUploadController : ControllerBase { private readonly IWebHostEnvironment _env; private readonly IServiceCollection _services; public DllUploadController(IWebHostEnvironment env, IServiceCollection services) { _env = env; _services = services; } [HttpPost("upload")] public async Task<IActionResult> UploadDll(IFormFile file) { if (file == null || file.Length == 0) return BadRequest("请选择要上传的DLL文件"); var uploadPath = Path.Combine(_env.ContentRootPath, "UploadedDlls"); Directory.CreateDirectory(uploadPath); var filePath = Path.Combine(uploadPath, file.FileName); using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } await LoadAndInjectDll(filePath); return Ok("DLL上传、加载及注入完成"); } }
2. 动态加载DLL并注入接口服务
实现DLL加载、接口与实现类匹配,完成服务注入:
private async Task LoadAndInjectDll(string dllPath) { // 加载目标DLL程序集 var assembly = Assembly.LoadFrom(dllPath); // 筛选WBAPI生成的接口及对应实现类(假设接口以I开头,实现类对应接口名去掉前缀I) var interfaceTypes = assembly.GetTypes().Where(t => t.IsInterface && t.Name.StartsWith("I")); foreach (var interfaceType in interfaceTypes) { var implementationType = assembly.GetTypes().FirstOrDefault(t => t.IsClass && !t.IsAbstract && interfaceType.IsAssignableFrom(t)); if (implementationType != null) { // 按Scoped模式注入服务,可根据需求改为Singleton/Transient _services.AddScoped(interfaceType, implementationType); } } // 注:.NET Core原生DI不支持运行时直接刷新服务提供者,若需实时生效,建议结合Autofac等第三方DI框架实现动态容器更新 }
关键注意事项
- 文件锁定处理:建议将上传的DLL复制到临时目录后再加载,避免原文件被锁定无法替换
- 服务注入生效:原生DI容器无法实时更新服务集合,若需运行时立即生效,需使用支持动态注册的第三方容器
- 类型匹配逻辑:需确保WBAPI生成的DLL中接口与实现类的命名规范统一,便于自动匹配查找

内容的提问来源于stack exchange,提问作者yo zh
相关产品推荐
相关产品推荐

