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,其实都有一个资源文件(要查看请“显示所有文件”)。同样可以应用管理器读取这个资源。
浙公网安备 33010602011771号