0002 WinForms资源管理

资源是在生成的时候绑定到程序集上的命名的数据块。

一、资源基础

通过绝对路劲获取资源会造成移植困难。这时需要将资源添加到程序集中。
对添加到项目中的资源,需要将其属性中的”生成操作“改为”嵌入的资源“。
794404-20170612094438400-1894673574.png

要检查文件是否已经被正确地嵌入项目的输出程序集,可以用.NET框架的SDK工具ILDasm.exe。通过命令行调用,选择当前项目的编译程序,打开”MANIFEST“清单,通过”查找“搜索是否存在添加的资源名。

访问资源清单的列表,通过System.Reflection.Assembly类

 
 
  1. //获得这个类型的程序集
  2. Assembly asm = this.GetType().Assembly;
  3. //枚举访问程序集的清单资源
  4. foreach (string resourceName in asm.GetManifestResourceNames())
  5. {
  6. MessageBox.Show(resourceName);
  7. }

知道清单资源的名称后,就可以通过`Assembly类的GetManifestResourcesStream'访问资源。

二、强类型资源

不管文件的扩展名是什么,嵌入的清单资源是没有类型信息的。

应用程序资源文件(.resx)

由于资源本身没有类型,所以选一个能够给资源打上合适的类型信息标签的地方。这就是应用程序资源文件(.resx)的主要作用。遵循一种叫做Resx的.NET特定的XML架构,用来持久化保存资源类型信息。

资源管理器

资源管理器:是在VS中打开.resx文件时显示的界面。
794404-20170612094438759-326860865.png
删除资源时需要从资源管理器中删除,如果直接从项目中删除仍会在元数据中保留引用,编译时会报错。

直接使用.resx文件

通过System.Resources.RexXResourceReader类

 
 
  1. using (ResXResourceReader reader =
  2. new ResXResourceReader(绝对路径))
  3. {
  4. foreach (DictionaryEntry entry in reader)
  5. {
  6. string s = string.Format("{0} ({1})='{2}'",
  7. entry.Key, entry.Value.GetType(), entry.Value);
  8. MessageBox.Show(s);
  9. }
  10. }

使用编译后的.resx资源

生成项目会导致.resx数据被嵌入为嵌套资源,是被分组放在某个命名容器中的资源。

通过ILDasm.exe查看:
794404-20170612094439087-1432188563.png

可以通过resgen.exe.resx文件编译进.resources文件

 
 
  1. C:\> resgen.exe MyResources.resx

将.resx文件编译进文件系统中.resources文件后,就可以从清单资源流访问.resources文件。

 
 
  1. Assembly asm = Assembly.GetExecutingAssembly();
  2. //加载嵌入的.resources文件
  3. using (Stream stream = asm.GetManifestResourceStream(this.GetType(),
  4. "MyResource.resources"))
  5. {
  6. //在.resources数据流中查找资源
  7. using (ResourceReader reader =
  8. new ResourceReader (stream))
  9. {
  10. foreach (DictionaryEntry entry in reader)
  11. {
  12. if (entry.Key.ToString() == "MyString")
  13. {
  14. MessageBox.Show("MyString = " + (string)entry.Value);
  15. break;
  16. }
  17. }
  18. }
  19. }

三、资源管理器System.Resources.ResourceManager

ResourceManager类是由嵌入的.resources文件来初始化的

 
 
  1. //获取这个类型的程序集
  2. Assembly asm = this.GetType().Assembly;
  3. //将.resources文件加载到ResourceManger
  4. ResourceManager resman = new ResourceManager("WinFormsResource.MyResource", asm);

从资源管理器访问资源

创建资源管理器后,就可以用GetObject方法获取嵌套的资源

 
 
  1. //从ResourceManger访问MyString字符串资源
  2. string s1 = (string)resman.GetObject("MyString");
  3. string s2 = resman.GetString("MyString");

强类型资源类

项目中的MyResources.Designer.cs文件暴露字符串、图标、图像、声音和文本文件资源。
794404-20170612094439587-1660369874.png

 
 
  1. //访问MyResources.resx中的强类型资源
  2. string s3 = MyResource.MyString;

转载于:https://www.cnblogs.com/He-Ming/p/6991390.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值