为何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.cs的ConfigureServices方法里,手动加载依赖程序集并添加到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.




