C#资源管理(2004.10)
资源是在逻辑上由应用程序部署的任何非可执行数据。资源可以在应用程序中作为错误信息显示,或者作为用户界面的一部分显示。资源可以包含多种形式的数据,包括字符串、图像和持久的对象。通过在资源文件中存储您的数据,您无需重新编译整个应用程序即可更改数据。请注意,为了将持久对象写入资源文件,这些对象必须是可序列化的。
资源的最主要用途:对区域性和多语言的支持。
使用程序集链接器 (Al.exe) 可以将 .resources 文件编译成附属程序集。附属程序集只能包含资源,不包含任何可执行代码。
在.Net中使用资源常见的有以下两种方式:将资源文件作为单独的文件链接到程序集中,和将资源嵌入PE文件中。
1.将资源文件作为单独的文件链接到程序集中:
(1)首先在解决方案资源管理器中添加所要嵌入的Rude资源(如某个位图等)。
(2)修改目标资源的"生成操作"属性为"嵌入的资源"。
(3)在程序中如下使用资源:
如有4个BMP图片资源,则以如下方式将其放入一个imagelist中
System.Reflection.Assembly thisExe;
this.thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file1 = thisExe.GetManifestResourceStream("DBCodeFactory.Recourse.OPEN.BMP");
System.IO.Stream file2 = thisExe.GetManifestResourceStream("DBCodeFactory.Recourse.NEW.BMP");
System.IO.Stream file3 = thisExe.GetManifestResourceStream("DBCodeFactory.Recourse.SAVE.BMP");
System.IO.Stream file4 = thisExe.GetManifestResourceStream("DBCodeFactory.Recourse.DB.BMP");
this.imageList1.Images.Add(Image.FromStream(file1));
this.imageList1.Images.Add(Image.FromStream(file2));
this.imageList1.Images.Add(Image.FromStream(file3));
this.imageList1.Images.Add(Image.FromStream(file4));
注意路径:"DBCodeFactory.Recourse.OPEN.BMP" , DBCodeFactory为当前项目输出的命名空间,Recourse为解决方案资源管理器中的文件夹,4个位图都在该目录下, OPEN.BMP为目标资源名称。
2.将资源嵌入PE文件中--使用System.Resources命名空间创建和使用资源文件
一个资源文件可以包含众多的资源,这些资源可分为三种类型:字符串,字节数组,任意对象。
//创建资源
ResourceWriter rw = new ResourceWriter ( "My.resources" ) ;
Image image1 = Image.FromFile ("abc1.jpg") ;
rw.AddResource ( "abc1" , image1 ) ; //object , "abc1"是唯一标志符
rw.AddResource( "abc4","这是从资源文件中读出的字符"); //string
rw.Generate ( ) ;//产生资源文件 My.resources
rw.Close ( ) ;
在需要使用资源的项目中包含My.resources文件,并将My.resources文件的"生成操作"属性修改为为"嵌入的资源"。然后就可以使用嵌入的资源了。
//使用资源
System.Resources.ResourceManager rm = new ResourceManager("Res.My",Assembly.GetExecutingAssembly());
//"Res.My"中的"Res"不是创建资源的命名空间,而是包含该资源的项目(即当前项目)的命名空间。"My"则对应 "My.resources"。
this.pictureBox1.Image = (Bitmap)rm.GetObject("abc1");
注:此种资源文件的创建很类似于序列化与反序列化的过程,但又强于序列化,即资源的生成过程种用到了序列化的功能。