通过AssemblyLoadContext实现运行时动态加载程序集,结合ApplicationParts注册控制器与服务,并利用IViewLocationExpander支持Razor视图扩展,使用Collectible AssemblyLoadContext管理插件生命周期,实现ASP.NET Core的模块化架构。

在 ASP.NET Core 中实现应用程序部件的动态加载,通常指的是在运行时加载程序集(如控制器、Razor 页面、视图或服务),而不需要在编译时静态引用。虽然 ASP.NET Core 本身不直接提供“插件式”架构,但可以通过一些机制来实现动态加载功能。
使用 AssemblyLoadContext 动态加载程序集
你可以通过继承 AssemblyLoadContext 来创建自定义上下文,用于加载外部的程序集(例如从磁盘或网络):
- 将插件 DLL 放置在应用目录外的指定文件夹中
- 使用
AssemblyLoadContext.Default.LoadFromAssemblyPath()或自定义上下文加载 - 加载后可通过反射查找类型并注册到依赖注入容器
示例代码片段:
var assemblyPath = Path.Combine(pluginFolder, "MyPlugin.dll"); var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath);
动态注册控制器和服务
加载程序集后,需要让 ASP.NET Core 知道其中包含的控制器:
- 在
Program.cs或启动类中,使用MvcBuilderPartManager添加应用模型 - 调用
builder.Services.AddControllers().PartManager.ApplicationParts.Add(...) - 扫描程序集中的控制器类型,并将其添加到应用部件集合
示例:
微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,旨在提供便捷的用户体验,无需下载安装即可在微信内使用。本压缩包包含了丰富的源码资源,涵盖了多个领域的应用场景,下面将逐一介绍其中涉及的知识点。1. 图片展示:这部分源码可能涉及了微信小程序中的``组件的使用,用于显示图片,以及`wx.getSystemInfo`接口获取屏幕尺寸,实现图片的适配和响应式布局。可能还包括了图片懒加
builder.Services.AddControllers()
.ConfigureApplicationPartManager(manager =>
{
var part = new AssemblyPart(assembly);
manager.ApplicationParts.Add(part);
});
动态加载 Razor 视图或页面(可选)
如果插件包含 Razor 视图或 Pages,需配置视图位置扩展器:
- 实现
IViewLocationExpander来支持自定义视图路径 - 使用
RazorViewEngineOptions添加额外的视图搜索路径 - 或使用预编译视图(Razor 类库)并确保其被正确引用
热更新与卸载注意事项
.NET 默认的 AssemblyLoadContext 不支持卸载,除非使用 Collectible AssemblyLoadContext:
- 创建可收集的上下文以允许后期卸载插件
- 设置
isCollectible: true - 注意:无法卸载正在使用的程序集,需谨慎管理生命周期
基本上就这些。ASP.NET Core 的动态加载依赖于程序集加载、应用部件管理和依赖注入的配合。虽然比传统插件系统复杂,但在微服务或模块化系统中非常实用。关键是控制好加载路径、类型发现和生命周期管理。









