无需重建项目,更新.NET日文附属资源程序集
无需重建项目更新.NET日文文化附属程序集资源
问题背景
开发.NET项目时,需更新日文(ja-JP)文化附属程序集中的单个资源,但受项目限制无法重建整个项目。当前项目使用Greeting.ja-JP.resx做本地化,已有对应附属程序集,但替换手动生成的Example.resources.dll后,程序仍读取默认资源值。
已执行操作
- 手动更新
Greeting.ja-JP.resx文件 - 使用VS2019开发者命令提示符执行以下命令:
resgen Greeting.ja-JP.resx Greeting.ja-JP.resourcesal -target:lib -embed:Greeting.ja-JP.resources -culture:ja-JP -out:Example.resources.dll - 将生成的
Example.resources.dll替换到输出目录的bin/debug/ja-JP/路径下
核心问题
你的ResourceManager构造函数指定的资源根名称是Example.Greeting,但生成的.resources文件命名为Greeting.ja-JP.resources,两者不匹配。.NET资源管理器会按照[根名称].[文化].resources的格式查找附属程序集中的嵌入资源,名称不匹配时会 fallback 到默认资源。
正确操作步骤
1. 确保.resx文件已更新
打开Greeting.ja-JP.resx,修改目标资源项(比如HelloString的内容)并保存。
2. 生成正确命名的.resources文件
使用resgen工具生成与资源根名称匹配的资源文件,命令如下:
resgen Greeting.ja-JP.resx Example.Greeting.ja-JP.resources
- 这里的
Example.Greeting.ja-JP.resources对应ResourceManager的根名称Example.Greeting+ 文化标识ja-JP,是资源管理器查找的标准格式。
3. 重新生成附属程序集
使用al.exe(程序集链接器)将正确命名的.resources文件嵌入到附属程序集中,命令:
al -target:lib -embed:Example.Greeting.ja-JP.resources -culture:ja-JP -out:Example.resources.dll
-embed参数必须指定正确的.resources文件名,确保资源管理器能识别-culture严格指定ja-JP,与目标文化目录匹配-out输出的文件名必须为[项目名称].resources.dll,这里项目名称是Example,所以命名为Example.resources.dll
4. 替换附属程序集
将生成的Example.resources.dll复制到项目输出目录的ja-JP子目录下,覆盖原文件:
Example/bin/debug/ja-JP/Example.resources.dll
5. 验证更新
- 关闭正在运行的程序实例(确保加载新的DLL,避免文件锁定或缓存)
- 重新启动程序,切换到
ja-JP文化,检查是否读取到更新后的资源值
补充说明
- 若替换后仍未生效,可检查以下几点:
- 确认.resources文件命名完全匹配
[根名称].[文化].resources - 检查
al.exe命令是否正确嵌入了目标.resources文件(可使用ILSpy等工具查看附属程序集的嵌入资源) - 确保程序运行时加载的是替换后的DLL(可查看文件修改时间)
- 确认.resources文件命名完全匹配
内容的提问来源于stack exchange,提问作者shubham shishodia
相关产品推荐
相关产品推荐

