修改引用的.NET Web控件DLL中resx资源值遇问题求助
解决引用的.NET Web控件外部修改resx资源不生效的问题
这个问题我之前帮不少开发者踩过坑,核心原因是默认情况下类库的.resx文件会被嵌入到DLL中,你在ZZZ项目里修改任何文件都碰不到DLL里打包好的资源,自然不会生效。下面给你一步步的解决方案:
1. 调整YYY项目中资源文件的编译属性
首先得把UIControl.resx从DLL里“解放”出来:
- 打开YYY项目,找到UIControl.resx文件
- 在属性窗口中,把生成操作改成「内容」,复制到输出目录改成「如果较新则复制」
- 如果有对应的多语言资源文件(比如UIControl.zh-CN.resx),也要做同样的设置
这样编译YYY项目后,resx文件会和DLL一起输出到bin目录,而不是被打包进DLL内部。
2. 修改XXX Web控件的资源读取逻辑
原来的控件代码应该是用默认的强类型资源类(比如Resources.UIControl.YourLabelKey)读取嵌入资源,现在要改成读取外部的resx文件:
// 在XXX控件的代码中,替换原来的资源读取逻辑 public string GetLabelText(string resourceKey) { // 定位到bin目录下的resx文件 string resxPath = HttpContext.Current.Server.MapPath("~/bin/UIControl.resx"); using (var resxSet = new ResXResourceSet(resxPath)) { return resxSet.GetString(resourceKey) ?? "默认值"; } }
如果需要支持多语言,可以根据当前线程的文化信息加载对应的资源文件(比如UIControl.zh-CN.resx),只需要把路径里的文件名改成对应文化版本即可。
3. 在ZZZ项目中确保资源文件正确部署
- 重新编译YYY项目,把更新后的DLL和resx文件复制到ZZZ项目的bin目录下(如果是通过项目引用,VS应该会自动复制内容文件,要是没自动复制就手动拷贝)
- 现在用户直接修改ZZZ项目bin目录下的UIControl.resx文件,保存后重启一下应用池(或者回收应用程序),刷新页面就能看到修改后的标签值了
额外注意事项
- 缓存问题:如果你的控件有缓存资源内容的逻辑,记得移除缓存,或者设置缓存依赖于resx文件,这样文件修改后缓存会自动失效
- 权限问题:确保服务器上的应用程序池账号对ZZZ项目的bin目录有读写权限,否则用户无法修改resx文件
- 多语言支持:如果需要多语言,要保证对应的区域性资源文件(如UIControl.en-US.resx)也按同样的方式部署,并且代码中根据当前文化加载正确的文件
内容的提问来源于stack exchange,提问作者jersoft
相关产品推荐
相关产品推荐

