Blazor WASM发布后懒加载RCL资源附属程序集未加载问题
问题原因
这是.NET 6 Blazor WASM懒加载场景下的典型问题,核心诱因有两个:
- 默认发布流程只会自动把主项目直接引用的附属资源程序集写进
blazor.boot.json的加载清单,配置为懒加载的Razor类库的附属资源DLL,不会被自动识别加入懒加载列表 - 你使用的6.0.300版本.NET SDK默认开启了附属资源裁剪逻辑,没被显式加入加载清单的资源DLL会在发布阶段直接被剔除,最终导致发布后对应文化的资源程序集缺失,资源访问失败
解决方案
按以下步骤配置即可修复:
1. 修正Razor类库(项目B)的发布配置
打开项目B的.csproj文件,在<PropertyGroup>节点下添加以下配置,避免资源被误裁剪、强制输出所有文化的附属程序集:
<PropertyGroup> <!-- 关闭附属资源自动裁剪,防止非默认文化的资源DLL被删除 --> <BlazorWebAssemblyEnableSatelliteResourceCulling>false</BlazorWebAssemblyEnableSatelliteResourceCulling> <!-- 配置需要输出的资源语言,填all代表输出所有存在的语言资源 --> <SatelliteResourceLanguages>all</SatelliteResourceLanguages> </PropertyGroup>
2. 给主项目(项目A)添加发布后补全懒加载清单的编译目标
打开项目A的.csproj文件,在文件末尾的</Project>标签前添加以下MSBuild Target,自动将懒加载类库的附属资源DLL加入懒加载清单,该配置会自动扫描项目B所有文化对应的附属DLL,不需要手动逐个添加文化路径:
<Target Name="AppendLazySatelliteAssemblies" AfterTargets="BlazorPublishAssets"> <ItemGroup> <!-- 匹配项目B对应的所有文化附属资源DLL --> <BProjectSatellites Include="@(ResolvedAssembliesToPublish)" Condition="%(FileName) == 'ProjectB.resources' And %(Extension) == '.dll'" /> </ItemGroup> <ItemGroup> <!-- 将匹配到的资源DLL加入Blazor懒加载程序集列表 --> <_BlazorLazyLoadedAssembly Include="@(BProjectSatellites)" /> </ItemGroup> </Target>
3. 适配运行时加载逻辑
在项目A配置懒加载程序集加载的代码段中,补充加载对应文化资源的逻辑:在调用LazyAssemblyLoader.LoadAssembliesAsync加载项目B主DLL时,同步加载当前线程UI文化对应的资源DLL,示例代码:
// 例如在路由跳转前触发懒加载的逻辑中 var assembliesToLoad = new List<string> { "ProjectB.dll" }; var currentCulture = CultureInfo.CurrentUICulture.Name; // 追加对应文化的附属资源DLL路径 assembliesToLoad.Add($"{currentCulture}/ProjectB.resources.dll"); await lazyAssemblyLoader.LoadAssembliesAsync(assembliesToLoad);
4. 版本兼容处理
如果完成以上配置后发布仍存在问题,将本地.NET 6 SDK升级到6.0.4xx及以上的稳定补丁版本即可,6.0.300版本存在懒加载场景下附属程序集清单生成的已知bug,后续补丁版本已经修复。
验证方式
重新发布项目后,检查两个位置确认配置生效:
- 发布目录
wwwroot/_framework下对应文化的子目录(比如el-GR)中存在ProjectB.resources.dll文件 - 打开
blazor.boot.json,在lazyLoadedAssemblies数组中可以看到对应文化资源DLL的路径条目
内容的提问来源于stack exchange,提问作者Yiannr
相关产品推荐
相关产品推荐

