博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET中使用嵌入的资源
阅读量:4571 次
发布时间:2019-06-08

本文共 2852 字,大约阅读时间需要 9 分钟。

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选择不同的包显示不同语言的字符串。

 

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

 

Figure.1 .resx资源文件可嵌入的资源类型

 

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

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

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

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

3、 资源存在方式

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

 

Figure.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);

 

转载于:https://www.cnblogs.com/tuyile006/archive/2013/04/23/3038093.html

你可能感兴趣的文章
找茬脚本思路(修改中)
查看>>
Java创建线程的细节分析
查看>>
python语法_深浅拷贝
查看>>
使用CCleaner卸载chrome
查看>>
typeof和GetType的区别
查看>>
xtraTabbedMdiManager控件切换时控件不更新的问题
查看>>
为易信正名
查看>>
debian8.4 ibus中文输入法
查看>>
《JAVA程序设计》实训第一天——《猜猜看》游戏
查看>>
P1896 [SCOI2005]互不侵犯
查看>>
ESP定律手工脱壳步骤
查看>>
wex5 教程 之 图文讲解 登陆,注册,页面跳转
查看>>
问题7:JavaScript 常用正则示例
查看>>
xampp 虚拟机配置
查看>>
第五次实验
查看>>
从统计学角度来看深度学习(1):递归广义线性模型
查看>>
nginx发布Asp.net程序
查看>>
Spring Bean引用例子
查看>>
您访问的URL地址不被允许。
查看>>
docker 初探之简单安装 ----Windows10
查看>>