C# Resources资源详解

2019-12-30 15:51:54刘景俊


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 两种方法访问特定区域性的资源。