如何在C#中使用内嵌资源文件

** 简介 ** ** **

在好多的 C# 和 .Net 的论坛中都会提到如何使用内嵌资源的话题 , 对大多一般的数项目来说 , 这也许更不就不是一个问题 . 但是 , 对于一些复杂的项目 , 这也许就成了问题 . 本文会把论坛中的内容汇总一下 , 比起查询论坛来 , 文章显得更容易查找和连接 .

** 第一件清楚的事情 ** ** **

在 VS.Net 中 , 有多种使用资源文件的方法 , 最常用的方法是让 Form 来保存它所使用的资源文件 , 这个可以通过产生一个 .resx 文件来保存 Form 所用到的资源 . 本文不是讨论这个话题 , 因为通常开发人员不会关心这个简单的问题 .

第二种方法是使用资源文件 , 本文重点在这儿 , 包括如何在资源文件中添加文件 , 如何设置内嵌资源的 ” 生成类型 ”.

** 名称是如何规定的 ** ** ? **

当你使用内嵌资源文件时 , 通常要知道资源的名称 . 实际上它可以像一个文件名 , 但是通常会比文件名更复杂一点点 .

命名一般包括三个部分 :< 缺省的命名空间 . >< 扩展命命名空间 . >< 文件名 >

上面的第一部分和最后的第三部分都好理解 . 缺省的命名空间就是项目的命名空间 , 文件名就是资源文件的名称 . 中间的这部分可能有些迷惑 .

简单的讲 , 扩展命名空间就是项目中的目录结构 . 如果你的资源文件就在项目的根目录下 , 扩展命名空间就不需要了 , 直接这样写就可以了 . < 缺省的命名空间 . > < 文件名 >. 但是如果你在项目中产生目录结果的话 , 就要使用使用扩展命名空间了 . 比如你在项目的根目录下产生了一个 Images 目录 , 那么资源文件就要这样来表示 : < 缺省的命名空间 . > Images. < 文件名 >. 如果你在 Images 路径下还有一个目录 FormGraphics, 那么资源文件就要这样表示 : < 缺省的命名空间 . > Images.FormGraphics. < 文件名 >

我想大家可能已经发现了上面的规律 , 在代码中你也可以这么写 . 当你在目录下使用 VS 自动产生了类 , 它也是安装这样的方式来命名类的名称 . < 缺省的命名空间 . >< 扩展命命名空间 . >. 虽然你可以手工的修改代码中的命名空间 , 但是有一点要记住 , 是不可以修改内嵌资源文件的命名空间结构的 .

** 如何得到资源 ** ** **

** 普通方法 ** ** **

普通的使用内嵌资源文件的方法是使用 Assembly 类的 GetManifestResource 方法 . 在第一个演示程序中 , 我们会使用下面这两个方法 GetManifestResourceNames, GetManifestResourceStream

这个演示程序会列举出一个装配件中的资源 , 可以把存选中的资源保到一个文件中 . 如果资源是一个图象 , 在程序中就可以显示出来 . 如果你还没有一个内嵌资源的装配件 , 第二个演示程序就是一个含有资源的装配件 .

这是在 ListBox 的 ListBox's SelectedIndexChanged 事件中 , 如果出来资源

System.IO.Stream stream = loadedAssembly.GetManifestResourceStream(

( string ) resources.SelectedItem);

System.Drawing.Image img = Image.FromStream(stream);

上面的演示程序把一个装配件调入内存 , 在 loadedAssembly 变量中存储一个 Assembly 实例 . 也许在你的应用程序中 , 不需要调用其他装配件的资源 , 你只是想能从你自己的程序中得到资源 .

最简单的方法是使用 Type 类的 Assembly 属性来得到某一个类的一个实例 , 你可以用下面的方法来得到 Type , 如果是一个类 , 使用 typeof(< class >) , 如果是一个类的实例变量 , 使用 GetType() .

** 另一种实现方法 ** ** **

GetManifestResourceStream 有两种重载方法 , 一种是从一个资源文件中来得到一个 Stream 对象 , 另一个中使用 Type 和 string . 第二个会帮助我们得到可以使用的资源 . 它会根据清单资源的范围由指定类型的命名空间确定资源清单

第二个演示程序是利用上面说得第二个方法来实现的 .

** 总结 ** ** **

当你理解了上面的内容后 , 对于 VS.net 内嵌资源的使用就是易于反掌了 . 唯一要注意的地方就是找出 VS.Net 给你的资源文件的名字 .

Published At
Categories with Web编程
Tagged with
comments powered by Disqus