不依赖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
相关产品推荐
相关产品推荐

