ResX文件报错:已含resheader仍提示无法找到有效读写器类型标签
问题原因及解决办法
你的ResX文件触发错误的核心原因有两个:
1. 缺少ResX解析器必需的标准元数据头
.NET的ResX资源文件要求必须包含固定的resmimetype、version、reader、writer这几个<resheader>标签,用来告诉解析器文件类型、版本以及读写器的类型信息。你现在的文件里全是自定义的text1-text5这类标签,完全没有这些关键元数据,解析器自然无法识别文件结构。
2. 错误用resheader存储普通资源
<resheader>是用来定义文件元数据的,不是存普通文本内容的地方。你要保存的Hello、my这类文本资源,应该用<data>标签来定义。
修正后的正确ResX文件
<root> <!-- 必须保留的标准元数据resheader --> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <!-- 自定义文本资源,用data标签存储 --> <data name="text1" xml:space="preserve"> <value>Hello</value> </data> <data name="text2" xml:space="preserve"> <value>my</value> </data> <data name="text3" xml:space="preserve"> <value>name</value> </data> <data name="text4" xml:space="preserve"> <value>is</value> </data> <data name="text5" xml:space="preserve"> <value>Jacob</value> </data> </root>
补充说明
- 上面的标准resheader内容适用于大多数.NET Framework场景,如果是.NET Core/.NET 5+环境,读写器的程序集信息会略有差异,但直接用上面的内容通常也能兼容。
- 所有普通资源都要放在
<data>标签内,name属性是资源的键,读取资源时通过这个键获取对应的值。
内容的提问来源于stack exchange,提问作者Jacobfs
相关产品推荐
相关产品推荐

