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

如何阻止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:27:17