2010年2月24日星期三

.Net嵌入资源与读取

资源文档顾名思义就是存放资源的文档。资源文档在程式设计中有着自身独特的优势,他单独于源程式,这样资源文档就能够被多个程式使用。同时在程式设计的时候,有时出于安全或其他方面因素的考虑,把重要东西存放在资源文档中,也能够达到保密、安全的效果。      

在.NET中,有文本文件.resx文件和 .resources 文件三种资源文件。如果资源将只包含字符串数据,则文本文件是最简单的选择。如果资源将包含对象或字符串与对象的组合,则必须创建 .resx 文件或 .resources 文件。注意,只有 .resources 文件才应能嵌入在公共语言运行库程序集和附属程序集中。

对于.resx文件,可以通过在项目点击右键->属性->资源 方式创建。也可以通过在项目点击右键->添加->新建项->资源文件 此方式创建。.resx方式可以添加字符串、文件、以及图片等。VS.NET中创建的这种文件也是将其转成.resources 文件然后根据设置将其嵌入到Assembly中。

对于添加到.resx文件中的资源,可以使用ResourceManager对象获取。

程序集中的资源文件名称,可以通过一下方法获得。

Assembly asm = Assembly.GetExecutingAssembly();

foreach (string name in asm.GetManifestResourceNames())

         MessageBox.Show(name);

Assembly.GetExecutingAssembly()方法可以获得当前的程序集.

1.获取字符串的方式为:

Assembly asm = Assembly.GetExecutingAssembly();

ResourceManager LocRM = new ResourceManager("ResourceRead.Properties.Resources",asm);

String str = LocRM.GetString("String1");

ResourceManager构造函数中的第一个参数"ResourceRead.Properties.Resources"是嵌入到程序中的资源的名称。(ResourceRead.Propertie是命名空间,Resources为类名)

2.获取图片的方式为:

Assembly asm = Assembly.GetExecutingAssembly();

ResourceManager LocRM = new ResourceManager("ResourceRead.Properties.Resources",asm);

Bitmap bmp = LocRM.GetObject("Image1")as Bitmap;

3.获取其他类型文件 (如获取名称为so的一个mp3文件,该文件嵌入到资源文件中)

Assembly asm = Assembly.GetExecutingAssembly();

ResourceManager LocRM = new ResourceManager("ResourceRead.Properties.Resources",asm);

byte[] buffer = LocRM.GetObject("so")as byte[];

FileStream FS = new FileStream("so.mp3", FileMode.Create);

BinaryWriter BWriter = new BinaryWriter(FS);

BWriter.Write(buffer, 0, buffer.Length);

BWriter.Close();

FS.Close();

有一种特殊情况,那就是当你直接嵌入一资源时,也就是说,不通过一个资源文件(.resources)而直接将一资源(Object)嵌入到 Assembly 在这种情况下ResourceManager就没有用 了,因为它只能获取.resources资源文件(在或不在Assembly中)。

比如在项目中添加一个文件,在项目解决方案中,选中该文件点击右键->生成操作,选择‘嵌入的资源’。则该文件就嵌入到生成的程序集中。此时可以通过Assembly对象的GetManifestResourceStream方法获取该资源,相关操作如下:

1.     读取文本文件

   Assemblyasm = Assembly.GetExecutingAssembly();

Stream s =  asm.GetManifestResourceStream(asm.GetName().Name + ".文本文件.txt");

//使用Streamreader读取

//StreamReader sr = new StreamReader(s,Encoding.Default);

//string str =sr.ReadToEnd();

//MessageBox.Show(str);

//读入byte数组

   byte[]  m_fileContent = newbyte[s.Length];

   s.Read(m_fileContent, 0,m_fileContent.Length);

   stringstr2 = System.Text.Encoding.Default.GetString(m_fileContent);

MessageBox.Show(str2);

2.读取图片及其他文件
Assembly asm = Assembly.GetExecutingAssembly();

Stream s = asm.GetManifestResourceStream(asm.GetName().Name + ".PH20081204111844.jpg");

Bitmap bt = new Bitmap(s);

Assembly asm = Assembly.GetExecutingAssembly();

Stream s =  asm.GetManifestResourceStream(asm.GetName().Name + ".其他文件");

byte[]  m_fileContent = new byte[s.Length];

 s.Read(m_fileContent, 0,m_fileContent.Length);
发表评论