VS2017与VS2019编译后.resources文件命名规则不一致问题咨询
根因分析
这个差异是项目系统的资源生成规则不同导致的,和VS版本匹配的默认项目模板有关:
- 旧版本(VS2017及更早)常用的非SDK风格.NET Framework csproj项目,.resx资源文件的生成默认遵循依赖项优先规则:会根据resx绑定的.cs文件内的类命名空间生成.resources文件名
- 新版(VS2019及之后)默认创建的SDK风格(.NET Core/.NET 5+)csproj项目,资源生成默认遵循路径优先规则:会根据resx文件所在的文件夹相对路径+文件名生成.resources文件名,和类的实际命名空间无关
修复方案
方案1:全局修改项目规则(推荐)
直接修改项目的.csproj文件,在第一组<PropertyGroup>节点内添加如下配置:
<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
开启这个配置后,SDK风格项目也会沿用老版本的规则,根据resx绑定的.cs文件内的类命名空间生成资源名,不需要修改业务代码。
方案2:单独指定目标资源的命名
如果不想全局修改规则,可以单独给这个视图对应的resx文件配置生成名:
在.csproj中找到这个.resx对应的<EmbeddedResource>节点,添加ManifestResourceName属性:
<EmbeddedResource Update="A/B/C/View.resx"> <ManifestResourceName>A.B.View.resources</ManifestResourceName> </EmbeddedResource>
也可以用项目变量避免硬编码:
<ManifestResourceName>$(RootNamespace).View.resources</ManifestResourceName>
方案3:调整资源加载逻辑匹配现有规则
如果不想修改项目配置,也可以调整ComponentResourceManager的调用逻辑,不需要硬编码完整文件名:
在创建资源管理器时直接传入视图类的类型,框架会自动匹配按路径生成的资源名:
ComponentResourceManager resources = new ComponentResourceManager(typeof(View));
内容的提问来源于stack exchange,提问作者ijk
相关产品推荐
相关产品推荐

