.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>
确保路径与实际编译输出的卫星程序集路径一致,重新打包后安装生效。
验证步骤
- 重新生成并打包
SampleNuget1 - 在测试项目中更新NuGet包引用
- 运行测试代码,检查是否能正确输出
ar-AE本地化内容
内容的提问来源于stack exchange,提问作者Sangram Patil
相关产品推荐
相关产品推荐

