You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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中接口与实现类的命名规范统一,便于自动匹配查找

DLL动态加载与注入流程

内容的提问来源于stack exchange,提问作者yo zh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:53:22