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

不依赖Resgen生成Satellite assemblies的可行方案咨询

我之前在部署自动化多语言资源流程的时候,也被Resgen的依赖搞得头大——干净的服务器上经常找不到这个工具,还要额外安装,确实不够优雅。这里有几个经过实践验证的替代方案,能帮你彻底摆脱对Resgen的依赖,让流程在服务器上顺畅运行:

替代Resgen生成卫星程序集的可行方案

1. 用.NET SDK内置的MSBuild任务(官方推荐)

这其实是Resgen的底层实现方式,直接用MSBuild的GenerateResource和AL任务,完全依赖.NET SDK,不需要单独安装Resgen。你可以写一个独立的MSBuild脚本,或者直接在现有项目文件里扩展:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="BuildSatelliteAssemblies">
    <!-- 第一步:将resx转换为.resources文件 -->
    <GenerateResource
      Sources="path/to/your/resources.resx"
      OutputResources="$(OutputDir)\$(Culture)\YourApp.resources"
      PublicClass="false"
    />
    <!-- 第二步:将.resources打包为卫星程序集 -->
    <AL
      EmbedResources="$(OutputDir)\$(Culture)\YourApp.resources"
      OutputAssembly="$(OutputDir)\$(Culture)\YourApp.resources.dll"
      TargetType="Library"
      Culture="$(Culture)"
    />
  </Target>
</Project>

执行的时候只需要用.NET CLI调用MSBuild:

dotnet msbuild /t:BuildSatelliteAssemblies /p:Culture=zh-CN /p:OutputDir=./output

这种方式的好处是完全贴合.NET生态,服务器只要装了.NET SDK就能跑,不需要额外配置。

2. 用C#代码手动实现(高度自定义)

如果你的流程需要更灵活的控制(比如动态读取resx、过滤资源、自定义输出路径),可以直接用.NET类库的API来处理,全程不需要任何外部工具:

using System.Resources;
using System.Reflection;
using System.Globalization;

// 读取resx文件内容
var resxPath = "path/to/your/resources.resx";
var culture = new CultureInfo("zh-CN");
var outputDir = Path.Combine("./output", culture.Name);
Directory.CreateDirectory(outputDir);

// 转换为.resources文件
var resourcesPath = Path.Combine(outputDir, "YourApp.resources");
using (var resxReader = new ResXResourceReader(resxPath))
using (var resourceWriter = new ResourceWriter(resourcesPath))
{
    foreach (DictionaryEntry entry in resxReader)
    {
        resourceWriter.AddResource(entry.Key.ToString(), entry.Value);
    }
}

// 生成卫星程序集
var assemblyName = new AssemblyName("YourApp.resources.dll")
{
    CultureInfo = culture
};

using (var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave))
{
    var moduleBuilder = assemblyBuilder.DefineDynamicModule("YourApp.resources");
    // 嵌入.resources文件
    moduleBuilder.DefineResource("YourApp.resources", "Localized resources", ResourceAttributes.Public);
    assemblyBuilder.Save(Path.Combine(outputDir, "YourApp.resources.dll"));
}

把这段代码打包成控制台程序,服务器上只要有.NET Runtime就能运行,完全摆脱外部工具依赖,还能根据自己的需求修改逻辑。

3. 集成到项目编译流程(适合持续集成)

如果你的项目本身用.NET SDK构建,可以直接在.csproj文件里配置自动生成卫星程序集,根本不需要单独的流程:

<Project Sdk="Microsoft.NET.Sdk">
  <!-- 启用多语言资源支持 -->
  <PropertyGroup>
    <GenerateSatelliteAssemblies>true</GenerateSatelliteAssemblies>
  </PropertyGroup>
  <!-- 添加不同语言的resx文件 -->
  <ItemGroup>
    <EmbeddedResource Include="Resources\Strings.resx" />
    <EmbeddedResource Include="Resources\Strings.zh-CN.resx">
      <DependentUpon>Strings.resx</DependentUpon>
      <LogicalName>YourApp.Strings.zh-CN.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
</Project>

执行dotnet build的时候,会自动生成对应语言的卫星程序集,输出到bin/[Configuration]/[Culture]目录下,全程自动化,不需要额外操作。

关键注意点

  • 不管用哪种方案,都要确保resx文件中的资源类型(字符串、图片、二进制数据)处理和原来的Resgen一致,避免出现资源加载错误。
  • 批量生成多语言卫星程序集时,只需要循环遍历需要支持的Culture代码即可,很容易扩展成自动化脚本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:28:46