0002 WinForms资源管理

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

1、资源基础

经过绝对路劲获取资源会形成移植困难。这时须要将资源添加到程序集中。
对添加到项目中的资源,须要将其属性中的”生成操做“改成”嵌入的资源“。
框架

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

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

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

知道清单资源的名称后,就能够经过`Assembly类的GetManifestResourcesStream'访问资源。spa

2、强类型资源

无论文件的扩展名是什么,嵌入的清单资源是没有类型信息的。命令行

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

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

资源管理器

资源管理器:是在VS中打开.resx文件时显示的界面。

删除资源时须要从资源管理器中删除,若是直接从项目中删除仍会在元数据中保留引用,编译时会报错。orm

直接使用.resx文件

经过System.Resources.RexXResourceReader类blog

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

使用编译后的.resx资源

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

经过ILDasm.exe查看:

能够经过resgen.exe.resx文件编译进.resources文件

 
 
 
 
C:\> resgen.exe MyResources.resx

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

 
 
 
 
Assembly asm = Assembly.GetExecutingAssembly();//加载嵌入的.resources文件using (Stream stream = asm.GetManifestResourceStream(this.GetType(), "MyResource.resources")){ //在.resources数据流中查找资源 using (ResourceReader reader = new ResourceReader (stream)) { foreach (DictionaryEntry entry in reader) { if (entry.Key.ToString() == "MyString") { MessageBox.Show("MyString = " + (string)entry.Value); break; } } }}

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

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

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

从资源管理器访问资源

建立资源管理器后,就能够用GetObject方法获取嵌套的资源

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

强类型资源类

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

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