You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何ASP.NET Core 2在.NET 4.7.1环境下无法自动加载依赖程序集?

解决ASP.NET Core 2无法自动加载完整.NET Framework依赖项目中控制器的问题

这个问题我之前也碰到过,确实是ASP.NET Core 2在程序集扫描逻辑上的一个小差异——它对.NET Standard程序集的控制器发现是默认启用的,但针对基于完整.NET Framework的依赖程序集,就需要我们手动配置一下ApplicationPartManager来让它识别这些程序集里的控制器。

为什么会出现这个差异?

ASP.NET Core 2的控制器发现机制依赖ApplicationPartManager,默认情况下它会自动扫描主应用程序集以及所有引用的.NET Standard程序集,因为这些程序集的兼容性模型和ASP.NET Core的加载上下文匹配。但完整.NET Framework的程序集运行在不同的加载环境下,默认不会被纳入自动扫描范围,所以里面的控制器就没法被自动识别。

具体解决步骤

你可以通过以下两种方式手动把完整.NET Framework的依赖程序集添加到控制器扫描范围内:

方法1:直接添加程序集到ApplicationParts

Startup.csConfigureServices方法里,手动加载依赖程序集并添加到ApplicationPartManager中:

using System.Reflection;
using Microsoft.AspNetCore.Mvc.ApplicationParts;

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .ConfigureApplicationPartManager(manager =>
        {
            // 加载你的完整.NET Framework依赖程序集
            // 这里可以用程序集名称,或者通过类型直接获取
            var dependentAssembly = Assembly.Load("YourDependentAssemblyName");
            // 将程序集添加为AssemblyPart
            manager.ApplicationParts.Add(new AssemblyPart(dependentAssembly));
        });
}

方法2:通过依赖项目中的控制器类型添加

如果知道依赖项目里的某个控制器类型,也可以直接通过该类型来获取程序集并添加,这样更不容易出错:

using Microsoft.AspNetCore.Mvc;

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        // 替换成你依赖项目里的任意控制器类型
        .AddApplicationPart(typeof(YourDependentController).Assembly);
}

额外注意事项

  • 确保你的完整.NET Framework依赖项目的目标版本和主Web应用一致(都是4.7.1),避免出现版本兼容性问题;
  • 如果你的依赖项目里还包含视图等其他组件,可能需要额外配置RazorViewEngine,但针对控制器的话,上面的配置就足够了。

内容的提问来源于stack exchange,提问作者Markus S.

火山引擎 最新活动