如何阻止Visual Studio根据资源文件名生成特定语言资源DLL
问题
将嵌入式资源文件从无意义名称(WelcomeA.rtf、WelcomeB.rtf)重命名为包含语言代码的名称(Welcome.en-us.rtf、Welcome.de-de.rtf)后,.NET构建开始将资源拆分到输出目录的语言代码子文件夹中的[AppName].resources.dll文件中,此前并不存在de-de和en-us文件夹,仅修改了源文件名,未更改项目设置:
D:\[AppName]\BIN\DEBUG\NET5.0-WINDOWS │ [AppName].deps.json │ [AppName].dll │ [AppName].exe │ [AppName].pdb │ [AppName].runtimeconfig.dev.json │ [AppName].runtimeconfig.json │ ├───de-de │ [AppName].resources.dll │ ├───en-us │ [AppName].resources.dll │ └───ref [AppName].dll
应用程序不支持Visual Studio在此处尝试实现的任何I18N模式。原本通过以下代码定位并加载嵌入式文档到RichTextBox中,但现在该代码已失效:
private void LoadWelcomeText(string langCode) { Assembly assembly = Assembly.GetExecutingAssembly(); richTextBox.Document.Blocks.Clear(); foreach (string s in assembly.GetManifestResourceNames()) { if (s.Contains("Welcome." + langCode + ".rtf")) { Stream stream = assembly.GetManifestResourceStream(s); richTextBox.Selection.Load(stream, DataFormats.Rtf); break; } } }
如何强制构建过程不根据源文件名重构应用程序架构?(已知可以通过重命名文件避开触发I18N识别的模式,但想解决问题而非规避。)
解决方案
要阻止.NET将带语言代码的资源文件编译为卫星资源,需修改项目文件(.csproj)的配置,明确指定资源的嵌入方式,避免按区域性拆分:
- 打开项目的
.csproj文件 - 添加以下配置,针对目标资源文件设置中性区域性标识,让构建系统将它们视为普通嵌入式资源:
<ItemGroup> <!-- 针对单个资源文件的配置 --> <EmbeddedResource Include="Welcome.en-us.rtf"> <Culture>neutral</Culture> <LogicalName>YourNamespace.Welcome.en-us.rtf</LogicalName> </EmbeddedResource> <EmbeddedResource Include="Welcome.de-de.rtf"> <Culture>neutral</Culture> <LogicalName>YourNamespace.Welcome.de-de.rtf</LogicalName> </EmbeddedResource> </ItemGroup>
或者使用通用匹配规则,批量处理所有符合Welcome.*.rtf格式的资源文件:
<ItemGroup> <EmbeddedResource Include="Welcome.*.rtf"> <Culture>neutral</Culture> <LogicalName>YourNamespace.%(Filename)%(Extension)</LogicalName> </EmbeddedResource> </ItemGroup>
关键配置说明
<Culture>neutral</Culture>:强制标记资源为中性区域性,阻止构建系统将其识别为特定语言的卫星资源<LogicalName>:指定资源在程序集中的完整名称,确保和你代码中通过GetManifestResourceNames()查找的格式一致(替换YourNamespace为实际项目的命名空间)
修改完成后重新构建项目,资源会直接嵌入主程序集,不再生成语言子文件夹和对应的.resources.dll,原有的加载代码即可恢复正常工作。
内容的提问来源于stack exchange,提问作者MK-3PP
相关产品推荐
相关产品推荐

