Blazor wasm(.Net5) 编译期未知项目动态懒加载实现方案问询
.NET5 Blazor WASM 编译期无预知动态项目加载实现方案
官方内置的懒加载方案核心是编译期提前声明待加载程序集、发布时预置到包内、运行时推迟加载时机,完全无法适配运行时才确定加载目标、甚至待加载项目在主站编译阶段还未完成开发的场景,可参考的落地方案如下:
适配场景的专用类库
- 针对Blazor WASM环境封装的通用动态加载类库,原生支持.NET5版本兼容,不需要在主站项目的csproj中预先声明任何待加载的程序集信息。类库内部已经实现了远端程序集递归拉取、依赖去重、静态资源自动注入、加载上下文适配的全流程逻辑,只需要在运行时传入待加载项目的部署包访问地址,即可完成整个独立项目的加载。
- 类库内置了版本冲突检测逻辑,加载外部程序集前会自动对比已加载的同名称程序集版本,避免WASM沙箱下因为加载冲突导致的运行时崩溃。
- 配套的扩展类会自动对接Blazor内置的依赖注入容器,扫描外部程序集中的服务注册标记,自动把服务实例加入主站的服务集合,不需要手动遍历程序集提取注册项。
零第三方依赖的原生实现路径
如果不想引入额外类库,可以按照以下步骤自行实现核心逻辑:
- 完全绕过官方懒加载的编译期校验流程:不使用
<BlazorWebAssemblyLazyLoad>配置节,所有程序集拉取动作全部在运行时完成,避免编译阶段因为找不到声明的程序集报错。 - 实现运行时部署清单拉取:将待加载的第二个独立项目单独发布为可静态托管的文件包,生成包含所有依赖dll路径、静态资源路径、版本号的JSON格式部署清单,这个清单的访问地址在主站运行时动态获取,编译期无需配置。
- 递归拉取程序集二进制流:通过主站内置的
HttpClient依次请求清单中的每个dll地址,对比当前运行时的已加载程序集字典,跳过已经加载完成的项,避免重复拉取浪费带宽。 - 加载程序集到WASM运行时上下文:.NET5 Blazor WASM内置了
WebAssemblyAssemblyLoader组件,可以直接将拉取到的dll二进制流加载到默认加载上下文。* 注意:.NET5版本的WASM运行时不支持自定义隔离的AssemblyLoadContext,所有加载的程序集会进入全局上下文,必须提前做好版本兼容性校验。 - 对接路由与组件渲染:程序集加载完成后,扫描程序集中所有继承自
ComponentBase的组件类型,将匹配的路由规则追加到全局路由表,用户导航到对应路径时直接实例化已加载的组件类型,同时通过JS互操作把外部项目引用的css、js资源注入到页面DOM中,避免样式和交互失效。
实现过程的常见注意事项
- 不要尝试用本地文件路径拉取待加载程序集,WASM的安全沙箱完全禁止非HTTP/HTTPS协议的资源访问,所有待加载文件必须部署在可通过网页协议访问的静态存储位置。
- 待加载的独立项目在发布时,需要将和主站共享的框架类库(如基础组件库、ASP.NET Core基础运行时)设置为不打包,直接复用主站已经加载的同版本程序集,避免因为版本不匹配触发运行时加载异常。
- 不要硬套官方懒加载的实现代码,两者的设计目标完全不同:官方懒加载是“已知待加载内容,仅推迟加载时机”,而我们需要实现的是“未知待加载内容,运行时动态拉取并加载”的逻辑,硬套会触发大量编译期校验报错。
内容的提问来源于stack exchange,提问作者Jens B
相关产品推荐
相关产品推荐

