WinUI 3本地化字符串资源在dotnet构建后报错:ResourceMap Not Found
WinUI 3多项目解决方案发布后ResourceMap Not Found异常修复方案
核心原因
多项目结构下,App.Strings项目的RESW资源在dotnet publish或CI构建过程中未被正确嵌入主项目输出包,导致ResourceLoader无法定位对应资源映射表。本地Visual Studio运行和dotnet build正常是因为开发环境自动处理了资源临时复制与引用,而发布/CI环境需显式配置资源嵌入规则。
解决方案步骤
1. 配置App.Strings项目的资源嵌入规则
打开App.Strings.csproj文件,添加或修改以下配置,确保RESW文件被正确嵌入并生成预期资源路径:
<ItemGroup> <!-- 将所有RESW文件设置为嵌入资源 --> <EmbeddedResource Include="**\*.resw"> <!-- 定义资源逻辑路径,保证ResourceLoader可识别 --> <LogicalName>Strings\%(RecursiveDir)%(Filename)%(Extension)</LogicalName> <!-- 确保资源随编译输出 --> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </EmbeddedResource> </ItemGroup>
2. 修改ResourceLoader初始化逻辑
在StringResourcesManager中,通过指定资源所在程序集初始化ResourceLoader,避免依赖默认查找路径:
private static StringResource BuildResource(string resourceName) { // 获取App.Strings项目的程序集 var stringsAssembly = typeof(StringResourcesManager).Assembly; // 使用资源名称+程序集的重载构造函数 ResourceLoader loader = new ResourceLoader(resourceName, stringsAssembly); return new StringResource(loader); }
注:
resourceName直接传入资源文件名(如HomeViewResources)即可,无需前缀App.Strings/。
3. 调整主项目对App.Strings的引用配置
打开主项目App.csproj,修改App.Strings的项目引用,确保资源能被复制到主项目发布目录:
<ProjectReference Include="..\App.Strings\App.Strings.csproj"> <!-- 禁止将资源标记为私有,确保发布时包含依赖项目资源 --> <PrivateAssets>None</PrivateAssets> </ProjectReference>
4. 优化XAML资源引用(可选)
XAML中使用x:Uid时,可简化路径为资源名+键,无需前缀/App.Strings/,确保资源系统正确查找:
<TextBlock x:Uid="HomeViewResources/FileTextBlock" />
5. CI构建命令优化(Github Actions)
在Github Actions工作流中,指定正确目标框架、配置,并安装所需Windows SDK:
steps: - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '6.0.x' - name: Install Windows SDK run: choco install windows-sdk-19041 - name: Build and Publish run: dotnet publish -c Release -f net6.0-windows10.0.19041.0 --self-contained true --output ./publish
验证步骤
- 本地执行
dotnet publish生成发布包,运行包内exe确认资源加载正常; - 推送修改至Github触发Actions工作流,验证CI构建后的exe无异常。
内容的提问来源于stack exchange,提问作者MatS2510
相关产品推荐
相关产品推荐

