资源是在生成的时候绑定到程序集上的命名的数据块。架构
经过绝对路劲获取资源会形成移植困难。这时须要将资源添加到程序集中。
对添加到项目中的资源,须要将其属性中的”生成操做“改成”嵌入的资源“。
框架
要检查文件是否已经被正确地嵌入项目的输出程序集,能够用.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
无论文件的扩展名是什么,嵌入的清单资源是没有类型信息的。命令行
因为资源自己没有类型,因此选一个可以给资源打上合适的类型信息标签的地方。这就是应用程序资源文件(.resx)的主要做用。遵循一种叫作Resx的.NET特定的XML架构,用来持久化保存资源类型信息。code
资源管理器:是在VS中打开.resx文件时显示的界面。
![]()
删除资源时须要从资源管理器中删除,若是直接从项目中删除仍会在元数据中保留引用,编译时会报错。orm
经过
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数据被嵌入为嵌套资源,是被分组放在某个命名容器中的资源。资源
经过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; } } }}
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;