You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework本地化字符串NuGet包无法加载非默认资源的问题

问题描述

创建了名为SampleNuget1的NuGet包,包含strings.resx和strings.ar-AE.resx两个字符串资源文件,已将访问修饰符设为public以允许外部程序集访问。使用代码如下:

CultureInfo ci = new CultureInfo("ar-AE");
SampleNuget1.strings.Culture = ci;
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Console.WriteLine(SampleNuget1.strings.Key1);

但上述代码仅返回默认strings.resx文件中的值,无法获取strings.ar-AE.resx的内容。注意:将SampleNuget1作为项目引用时功能正常,仅作为NuGet包使用时出现该问题。

原因分析

项目直接引用时,Visual Studio会自动编译本地化资源文件为卫星程序集,并复制到对应语言的子目录中(如ar-AE文件夹)。但默认NuGet打包配置不会自动包含这些卫星程序集,导致安装NuGet包后缺少对应语言的资源文件,无法加载本地化内容。

解决方法

方法1:SDK风格项目配置(推荐)

若SampleNuget1是.NET Core/.NET 5+的SDK风格项目,修改项目文件(.csproj)添加以下配置,确保打包时包含所有卫星程序集:

<PropertyGroup>
  <!-- 指定资源文件编译后的命名规则 -->
  <GenerateResourceFileNames>$(RootNamespace).strings.%(Culture).resources</GenerateResourceFileNames>
</PropertyGroup>

<ItemGroup>
  <!-- 标记本地化资源文件的依赖关系与逻辑名称 -->
  <EmbeddedResource Include="strings.ar-AE.resx">
    <DependentUpon>strings.resx</DependentUpon>
    <LogicalName>$(RootNamespace).strings.ar-AE.resources</LogicalName>
  </EmbeddedResource>
</ItemGroup>

<PropertyGroup>
  <!-- 配置NuGet打包包含指定语言的卫星程序集 -->
  <SatelliteResourceLanguages>ar-AE</SatelliteResourceLanguages>
</PropertyGroup>

修改后重新打包NuGet包,安装即可正常加载本地化资源。

方法2:手动编辑.nuspec文件

若使用传统.nuspec文件打包,在文件中添加对应语言的卫星程序集引用:

<package>
  <metadata>...</metadata>
  <files>
    <!-- 包含主程序集 -->
    <file src="bin\Release\net6.0\SampleNuget1.dll" target="lib\net6.0" />
    <!-- 包含ar-AE语言的卫星程序集 -->
    <file src="bin\Release\net6.0\ar-AE\SampleNuget1.resources.dll" target="lib\net6.0\ar-AE" />
  </files>
</package>

确保路径与实际编译输出的卫星程序集路径一致,重新打包后安装生效。

验证步骤

  1. 重新生成并打包SampleNuget1
  2. 在测试项目中更新NuGet包引用
  3. 运行测试代码,检查是否能正确输出ar-AE本地化内容

内容的提问来源于stack exchange,提问作者Sangram Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:22:21