您的位置:首页 > 移动开发 > Objective-C

.NET系统学习----Globalization & Resources

2007-07-25 09:43 363 查看
1.概念:资源文件就是程序中可利用的任何数据(字符串,图片或任何二进制格式的数据) 
2.类型:
2.1. .txt文件:只能有字符串资源.不能被嵌入到Assembly中
2.2..resx文件:由XML组成,可以加入任何资源,包括二进制格式的.不能被嵌入到Assembly中
2.3..resources文件:PE格式,可以加入任何资源.是唯一可以被嵌入到Assembly的文件.
3.调用资源文件的几种方法
3.1. .txt文件:不可以直接调用,得先将其转换成 .resources 文件才能使用
3.2..resx文件:不推荐直接调用.resx文件,将其转换成.resources文件,然后用ResourceManager读取 3.3..resources文件:
3.3.1.被嵌入或编译成卫星程序集(Satellite Assembly): 用ResourceManager的各种constructor来获得在Assembly中的资源。
3.3.2.单独文件,没有被编译或嵌入到Assembly中:可以用ResourceManager.CreateFileBasedResourceManager来获得资源集(ResourceSet),就是所有的资源。

特殊情况:
还有一种特殊情况,那就是当你直接嵌入一资源时,也就是说,不通过一个资源文件(.resources)而直接将一资源(Object)嵌入到 Assembly 中。这可以通过AL.exe(Assembly Linker)的参数/embed:<object>把资源嵌入在Assembly中。在这种情况下ResourceManager就没有用了,因为它只能获取.resources资源文件(在或不在Assembly中)。
调用这类直接嵌入在Assembly中的资源,我们就需要利用Reflection的一些特性来完成。在System.Reflection.Assembly类中有一些相关函数可以帮助我们拿到这些资源。通过Assembly.GetManifestResourceNames可以拿到所有的资源的名字,然后我们就可以通过Assembly.GetManifestResourceStream(<object_name>)这个函数拿到对应的资源并以stream的方式返回,然后我们可以将这个stream转成在.NET中可用的对象。比如,如果嵌入资源是一图片,那么我们可以利用New Bitmap(Stream)的constructor获得这个图片资源的Bitmap对象。

4.创建资源文件
创建资源文件有两种方式,
4.1. 使用.NET SDK自带的resgen工具来创建(resgen主要是针对txt文件使用)
     可以把.txt,.resX,转换为.resources文件,
4.2. 自己写code来创建(通过编程,使用.NET提供的IResourcesWrite类来实现把任何资源嵌入到resources文件中)
    private void OnGenerateResource(object sender, System.EventArgs e)
    { IResourceWriter rw = new ResourceWriter(“C:/test.resources”);
       switch (sType)
       {
              case "system.string":
              rw.AddResource(sKey,sValue);
              break;
              case "system.drawing.bitmap":
              Bitmap bmp = new Bitmap(sValue);
              rw.AddResource(sKey,bmp);
              break;
              case "system.drawing.image":
              Image img= new Bitmap(sValue);
              rw.AddResource(sKey,img);
              break;
 }
  }
说明:根据资源的类型,如果不是string类型的,我们就把它分实例化为相应的stream,然后加入到resoruces中即可(string类型可以直接加入)。生成的就是.NET可以直接使用的.resources文件:

5.在程序中使用资源文件
读取资源文件的代码为:

       private void SetCulture( CultureInfo ci )

       {

              // Change current UI culture

              Thread.CurrentThread.CurrentUICulture = ci;

 

              // Load culture resources.

              String AssemblyPath = Application.StartupPath + "//Culture.dll";

              Assembly asm = Assembly.LoadFrom(AssemblyPath);

 

// ResoruceManager constructor will load different resources acording to the

// CurrentUICulture. which means, if CurrentUICulutre is "en-US", rm will load

// "Culture.en-US.resources" automaticly.

// When loaded, give the resource name only.

              ResourceManager rm = new ResourceManager("Culture", asm);             

              // Set title, culture info and logo.

              this.lblTitle.Text = rm.GetString("Title");

              this.lblCulture.Text = rm.GetString("Culture");

              this.lblLogo.Text = rm.GetString("LogoTitle");

              this.imgLogo.Image=(Bitmap)rm.GetObject("Logo");

}

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息