using( ResXResourceReader reader =
new ResXResourceReader(@"C:MyResources.resx") ) {
foreach( DictionaryEntry entry in reader ) {
string s =string.Format("{0} ({1})= '{2}'",
entry.Key, entry.Value.GetType(), entry.Value);
MessageBox.Show(s);
}
}
* 使用编译的.resx 资源
您可以采用三种不同的方式创建资源文件。如果您的资源将只包含字符串数据,则最简单的方法是手动创建文本文件。如果您的资源将包含对象或字符串与对象的组合,则您必须创建 .resx 文件或 .resources 文件。只有.resources 文件才应嵌入在公共语言运行库程序集和附属程序集中。资源文件生成器 (Resgen.exe) 将文本 (.txt) 文件和基于 XML 的资源 (.resx) 文件转换成 .resources 文件,
资源生成器 Resgen.exe :
将 .txt 文件转换为 .resources 文件,方法是包装由 ResourceWriter 类实现的方法。Resgen.exe 还包装 ResourceReader,这使您可以使用该工具来将 .resources 文件转换回 .txt 文件。
编译项目后会将.resx数据嵌入为嵌套资源放在资源清单,例如项目缺省命名空间为A,rest文件为B.resx,则这个嵌套资源容器则为 A.B.resources,可以在ildasm中查看。对它的读取利用 ResourceReader 类,也不支持随机访问。
using( ResourceReader reader =
new ResourceReader("MyResources.resources") ) {
foreach( DictionaryEntry entry in reader ) {
string s =string.Format("{0} ({1})= '{2}'",
entry.Key, entry.Value.GetType(), entry.Value);
MessageBox.Show(s);
}
}
其实还可以直接通过对清单资源流的访问来操作 .resources 文件。
Assembly asm = Assembly.GetExecutingAssembly();
// Load embedded .resources file
using(
Stream stream = asm.GetManifestResourceStream(
this.GetType(),
"MyResources.resources") ) {
// Find resource in .resources stream
using( ResourceReader reader =new ResourceReader(stream) ) {
foreach( DictionaryEntry entry in reader ) {
if( entry.Key.ToString() =="MyString" ) {
// Display string resource value
MessageBox.Show("MyString = "+ (string)entry.Value);
break;
}
}
}
}
以上都需要进行多步操作而且不支持随机访问,但是.NET提供了 ResourceManager 类来支持对资源的随机访问。
(5) Resource Manager
ResourceManager 类可以查找区域性特定的资源,当本地化资源不存在时提供代用资源,并支持资源序列化,它其实也就是对ResourceReader的封装。它由一个嵌入.resource文件初始化:
Assembly asm =this.GetType().Assembly;
ResourceManager resman =new ResourceManager("ResourcesSample.MyResources", asm);
通过 ResourceManager 的方法,调用方可使用 GetObject 和 GetString 两种方法访问特定区域性的资源。










