我的C#世界

一个新手的C#学习历程,望大家多多指教

博客园 首页 新随笔 联系 订阅 管理

DotNet 资源初探

一、资源基础

1、加入资源:右击“解决方案资源管理器”,选择“添加现有项”。
2、将资源嵌入到程序集中:更改资源的属性项目中的生成操作选项。

3、观察:用ILDASM工具查看程序集,会找到.mresource之类的项,呵呵这就是资源了。请仔细研究其后代码与资源文件本身的关系。(

二、有什么用?

1、更好地定位与管理程序所要的资源。
2、保护你的资源(轻量级)。试想想如果将一个网站的图图都搞成Lib,那会是多爽爽的事?
……

三、使用资源

1、装载资源清单的示例代码如下:
   Assembly assem = this.GetType().Assembly;
   foreach(string resName in assem.GetManifestResourceNames())
   {
    MessageBox.Show(resName);
   }

2、得到了资源的名字就可以这样用:
   Assembly assem = this.GetType().Assembly;
   Stream stream = assem.GetManifestResourceStream("ResourcesApp.images.back.gif");
   this.BackgroundImage = new Bitmap(stream);

3、清单资源命名空间
GetManifestResourceStream有一个重载方法可以传入一个System.Type参数。这是一个重要的特性。这样很容易保持类型的命信空间与资源的命名空间相配。

示例代码一:
   Assembly assem = this.GetType().Assembly;
   Stream stream = assem.GetManifestResourceStream(this.GetType(),"images.back.gif");
   this.BackgroundImage = new Bitmap(stream);
   //this.BackgroundImage = new Bitmap(this.GetType(),"images.back.gif");

四、类型化资源

类型化资源的好处在于其类型可在运行时取得。

1、基于文本的类型化资源(.Resx文件)

添加:项目->添加新项->程序集资源文件。

事实上在VS.NET中能直接编辑的只有文本类型。如果要加入位图之类则必须使用XML视图,以Base64编码的方式加入。

读取ResX文件:
   using(ResXResourceReader rdr = new ResXResourceReader("Resource.resx"))
   {
    foreach(DictionaryEntry entry in rdr)
    {
     string s = string.Format("{0}, {1}='{2}'",entry.Key,entry.Value.GetType(),entry.Value);
     MessageBox.Show(s);
    }
   }

2、二进制类型化资源

将一个ResX文件嵌入到项目中:编译已加入ResX文件的项目即可。当然也可以应用:resgen.exe工具。

读取代码:
   Assembly assem = this.GetType().Assembly;
   Stream stream = assem.GetManifestResourceStream("ResourcesApp.Resource.resources");

   //or new ResourceReader("Resource1.resources")
   using(ResourceReader rdr = new ResourceReader(stream))
   {
    foreach (DictionaryEntry dic in rdr)
    {
                    MessageBox.Show(dic.Value.ToString());
    }
   }

五、资源管理器

不管理.resx还是.resoruces之类的嵌套资源,都要从Reader中遍历查找,多少有些麻烦。OK,看看ResoruceManager!

例子:
   Assembly assem = this.GetType().Assembly;
   ResourceManager resMan = new ResourceManager("Resourcesapp.Resource",assem);
   MessageBox.Show(resMan.GetString("MyString"));

资源管理器其实只是一个读取器的包装类。它依据传入的名字通过Reader进行枚举而已。

呵呵,对于在VS.NET下加入的每个Form,其实都有一个资源文件(要查看请“显示所有文件”)。同样可以应用管理器读取这个资源。

posted on 2006-03-20 00:16  新手探路  阅读(407)  评论(0)    收藏  举报