在.NET中读取嵌入和使用资源文件的方法

所属分类: 软件编程 / C#教程 阅读数: 90
收藏 0 赞 0 分享

Dotnet中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Stream。另一种方法是在项目中加入. resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源。

下面分别详述这两种方法

一、使用GetManifestResourceStream读取嵌入资源

1、加入资源文件

直接把要嵌入到程序集的资源文件加入到项目中,可以加在项目的根目录,可以加在项目的任何目录中。

2、设置资源文件的“BuildAction”属性

将嵌入资源文件的“BuildAction”属性设置为“Embedded Resource”

3、代码中使用嵌入资源

//获得正在运行类所在的名称空间

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string _namespace = type.Namespace;

//获得当前运行的Assembly

Assembly _assembly = Assembly.GetExecutingAssembly();

//根据名称空间和文件名生成资源名称

string resourceName = _namespace + ".directory.BitmapManifest.bmp";

//根据资源名称从Assembly中获取此资源的Stream

Stream stream = _assembly.GetManifestResourceStream(resourceName);

Image myImage = Image.FromStream(stream);

注意资源名称的组成规则:

项目默认名称空间.资源在项目中所在目录.资源文件名

上面代码中BitmapManifest.bmp位图就在项目的directory目录下。如果资源文件直接在项目根目录,则为项目默认名称空间.资源文件名

再给一个xml资源的例子:

//获得正在运行类所在的名称空间

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string _namespace = type.Namespace;

//获得当前运行的Assembly

Assembly _assembly = Assembly.GetExecutingAssembly();

//根据名称空间和文件名生成资源名称

string resourceName = _namespace + ".XMLFileTest.xml";

//根据资源名称从Assembly中获取此资源的Stream

Stream stream = _assembly.GetManifestResourceStream(resourceName);

 

XmlDocument xmlDoc = null;

xmlDoc = new XmlDocument();

xmlDoc.Load(stream);

二、使用. resx资源文件嵌入资源

1、新建资源文件

在项目中新建一个资源文件,资源文件以.resx为后缀,同时还会新建一个跟资源文件同名的Designer.cs文件。

其实资源文件最大的用处是用来做多语言版本的软件时保存不同语言的资源,比如不同语言的菜单文本,可以把不同语言的字符串放在同一个资源类型下的不同资源包中,程序运行时根据运行时系统的culture选择不同的包显示不同语言的字符串。

新建了资源文件后就能往资源文件中添加资源文件:

https://zhanzhang360.qulang.net/imgupload/005337/2016520100219123.gif
图1 .resx资源文件可嵌入的资源类型

资源中可以添加字符串、位图、图标、音频、文件等等的资源。

添加的资源都会被保存在项目的Resources文件夹中。

2、设置资源文件的“BuildAction”属性

Resources文件夹中的所有资源文件的“BuildAction”属性设置为“Embedded Resource”。

3、 资源存在方式

.resx资源文件管理的资源可以用两种存在形式,一种是以一般的文件形式存在于Resources文件夹中,另一个是经过Base64编码后嵌入到.resx资源文件中。

https://zhanzhang360.qulang.net/imgupload/005337/2016520100229966.gif
图2 .resx资源文件中资源存在方式 

打开.resx资源文件,选择资源,在属性中Persistence属性决定资源的存在形式。资源的两种存在形式,在代码中调用都是一样的。

4、 代码中使用嵌入资源

//获得正在运行类所在的名称空间

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string _namespace = type.Namespace;

//获取当前主程序集

Assembly currentAssembly = Assembly.GetExecutingAssembly();

//资源的根名称

string resourceRootName = _namespace + ".ResourceTest";

//实例化资源管理类

ResourceManager resourceManager = new ResourceManager(resourceRootName, currentAssembly);

//根据资源名获得资源对象

Icon myIcon = (Icon)resourceManager.GetObject("IconTest");

注意资源的根名称的规则:

资源的根名称就是这个资源文件类的全名称。

打开.resx资源文件相应的Designer.cs文件能看到资源类的全名称:名称空间.资源类名。

资源名就是某个资源在.resx资源文件中的名称。

打开.resx资源文件可以看到各个资源的名称。上面图中图标文件IconTest.ico的名称是IconTest。

若要检索“字符串”资源,请调用 GetString 方法。

若要检索其他类型的资源,请调用 GetObject 方法,并将得到的资源显式转换成对应的类型。

5、多语言的资源应用

//得到当前语言环境
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
//CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;

Icon myIcon = (Icon)resourceManager.GetObject("IconText", ci);

以上就是脚本之家的为大家整理的两种嵌入和使用资源文件的方法,本人比较偏向使用第二种,希望能帮到大家。

更多精彩内容其他人还在看

c#开发word批量转pdf源码分享

已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF,看下面的实例源码吧
收藏 0 赞 0 分享

c# xml API操作的小例子

这篇文章主要介绍了c# xml API操作的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

c#唯一值渲染实例代码

这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

淘宝IP地址库采集器c#代码

这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C#在后台运行操作(BackgroundWorker用法)示例分享

BackgroundWorker类允许在单独的专用线程上运行操作。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题,下面看示例
收藏 0 赞 0 分享

c#文本加密程序代码示例

这是一个加密软件,但只限于文本加密,加了窗口控件的滑动效果,详细看下面的代码
收藏 0 赞 0 分享

c#生成站点地图(SiteMapPath)文件示例程序

这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
收藏 0 赞 0 分享

C# 键盘Enter键取代Tab键实现代码

这篇文章主要介绍了C# 键盘Enter键取代Tab键实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm导出Excel方法介绍

在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
收藏 0 赞 0 分享

C#串口通信程序实例详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧
收藏 0 赞 0 分享
查看更多