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

下面分别详述这两种方法

一、使用GetManifestResourceStream读取嵌入资源

1、加入资源文件

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

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

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

3、代码中使用嵌入资源

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string_namespace = type.Namespace;

//获得当前运行的Assembly

Assembly _assembly = Assembly.GetExecutingAssembly();

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

stringresourceName = _namespace + ".directory.BitmapManifest.bmp";

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

Stream stream = _assembly.GetManifestResourceStream(resourceName);

Image myImage = Image.FromStream(stream);

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

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

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

再给一个xml资源的例子:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string_namespace = type.Namespace;

//获得当前运行的Assembly

Assembly _assembly = Assembly.GetExecutingAssembly();

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

stringresourceName = _namespace + ".XMLFileTest.xml";

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

Stream stream = _assembly.GetManifestResourceStream(resourceName);

 

XmlDocument xmlDoc = null;

xmlDoc = newXmlDocument();

xmlDoc.Load(stream);

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

1、新建资源文件

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

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

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

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

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

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

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

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

3、 资源存在方式

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

图2 .resx资源文件中资源存在方式

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

4、 代码中使用嵌入资源

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string_namespace = type.Namespace;

//获取当前主程序集

Assembly currentAssembly = Assembly.GetExecutingAssembly();

//资源的根名称

stringresourceRootName = _namespace + ".ResourceTest";

//实例化资源管理类

ResourceManager resourceManager = newResourceManager(resourceRootName, currentAssembly);

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

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

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

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

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

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

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

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

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

5、多语言的资源应用

?

1

2

3

4

5

//得到当前语言环境

CultureInfo ci = Thread.CurrentThread.CurrentCulture;

//CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;

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

c#中中读取嵌入和使用资源文件的方法相关推荐

  1. IntelliJ IDEA 中的Java Web项目的资源文件复制新增如何更新到部署包中?

    文章目录 resources目录下的文件复制新增 webapp目录的文件复制新增 IntelliJ IDEA 中的Java Web项目的资源文件如果复制新增,正常的重新部署.重启服务器.update ...

  2. MATLAB中无法读取图像或无法打开文件等类似问题

    MATLAB中无法读取图像或无法打开文件等类似问题     在MATLAB中进行图像处理算法的仿真是十分方便的,读取图像自然是常规的第一步,那么很多时候会遇到无法读取图像的错误,如果MATLAB报错为 ...

  3. python合并txt文本_Python实现将目录中TXT合并成一个大TXT文件的方法

    本文实例讲述了Python实现将目录中TXT合并成一个大TXT文件的方法.分享给大家供大家参考.具体如下: 在网上下了一个dota的英雄攻略,TXT格式,每个英雄一个文件,看得疼,就写了一个小东西,合 ...

  4. python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...

    本文实例讲述了python实现将MySQL数据库表中的数据导出生成csv格式文件的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding:utf- ...

  5. Pycharm中无法通过点击查看csv文件解决方法

    Pycharm中无法通过点击查看csv文件 问题描述: Pycharm中无法像上图中一样通过点击打开csv文件 解决方法: 在Pycharm项目界面中找到对应文件,鼠标左键双击,此时右下角会出现红色感 ...

  6. java导出jar包后,程序运行时读取图片、音乐资源文件

    java导出jar包后,程序运行时读取图片.音乐资源文件 运行时程序就可以把图片.音乐资源加载进入了 start jre/bin/java -jar 名称.jar

  7. python读取数据库数据、并保存为docx_Python从数据库读取大量数据批量写入文件的方法...

    Python从数据库读取大量数据批量写入文件的方法 使用机器学习训练数据时,如果数据量较大可能我们不能够一次性将数据加载进内存,这时我们需要将数据进行预处理,分批次加载进内存. 下面是代码作用是将数据 ...

  8. 安卓读取mysql数据库文件路径_Android开发实现读取assets目录下db文件的方法示例...

    本文实例讲述了Android开发实现读取assets目录下db文件的方法.分享给大家供大家参考,具体如下: 最近准备打算写一个关于天气预报的app,偶然的机会在一大神的博客上看到了一个获取天气的api ...

  9. Android应用资源文件替换方法

    Android应用资源文件替换方法 仅供学习研究. 一 工具 1 7zip压缩解压缩软件 2 AndroidResEdit签名软件 二 步骤 以替换应用程序图标为例: 1 使用7zip提取androi ...

最新文章

  1. 干货 | MTCNN实时人脸检测网络详解与代码演示
  2. IE9最终版透露IE10信息 或将自动在线升级
  3. Linux下VMware虚拟机报Could not open /dev/vmmon: No such file or directory. Please make sure that the kern
  4. 基于angular4+ng-bootstrap+bootstrap+scss的后台管理系统界面
  5. 天才基本法_【书鱼扫文】天才基本法:天才与中国式青春
  6. 广播电视加速技术迭代,如何用新技术拥抱行业转型?
  7. linux下拷贝文件的时候出现权限不够,如何解决
  8. Facebook广告与Google广告有什么不同?
  9. 大学生html作业总结,总结 HTML标签作业
  10. Coursera机器学习week11 单元测试
  11. Atitit 词法分析器的设计最佳实践说明attilax总结
  12. 【EJB】Developing EJB Applications -- Chapter 2(创建企业级Bean项目)
  13. oracle 数据库备份脚本
  14. 版本控制软件 perforce 与 git
  15. 网桥算法的源代码c语言版,透明网桥算法(C语言)
  16. 人类有两大学习能力,即记忆力和理解力
  17. 如何用idea比对代码差异
  18. 敏捷开发绩效管理之九:阿米巴经营之软件团队经营什么(上)
  19. 在线下载离线地图瓦片 (支持百度、高德和谷歌地图)
  20. java日志管理(slf4j+logback,tomcat)

热门文章

  1. python学习-元组tuple(定义、删除、长度、复制、查找、遍历、operator,和列表的区别)
  2. mysql 360怎么安装_MySQL安装方法
  3. Flask和mysql多线程_数据库连接池Flask-SQLAlchemy中多线程安全的问题
  4. python手机号码正确编程_python 小练习之生成手机号码
  5. 元件又焊反了,电路板又在冒烟了!
  6. 变局之际,聊聊物联网的过去、现在和未来
  7. 为什么嵌入式工程师会对8位MCU有误解?
  8. 自己动手写CPU(8)加载存储指令的实现
  9. qtdesigner设计表格_实例9 利用Qt Designer设计一个对话框
  10. c语言电子计算器课程设计报告,计算机程序设计课程设计报告.doc