二、强类型资源
应用程序资源文件(.resx)
资源管理器
直接使用.resx文件
使用编译后的.resx资源
三、资源管理器System.Resources.ResourceManager
从资源管理器访问资源
强类型资源类
资源是在生成的时候绑定到程序集上的命名的数据块。
一、资源基础
通过绝对路劲获取资源会造成移植困难。这时需要将资源添加到程序集中。
对添加到项目中的资源,需要将其属性中的”生成操作“改为”嵌入的资源“。
要检查文件是否已经被正确地嵌入项目的输出程序集,可以用.NET框架的SDK工具ILDasm.exe。通过命令行调用,选择当前项目的编译程序,打开”MANIFEST“清单,通过”查找“搜索是否存在添加的资源名。
访问资源清单的列表,通过System.Reflection.Assembly类
:
//获得这个类型的程序集
Assembly asm = this.GetType().Assembly;
//枚举访问程序集的清单资源
foreach (string resourceName in asm.GetManifestResourceNames())
{
MessageBox.Show(resourceName);
}
知道清单资源的名称后,就可以通过`Assembly类的GetManifestResourcesStream'访问资源。
二、强类型资源
不管文件的扩展名是什么,嵌入的清单资源是没有类型信息的。
应用程序资源文件(.resx)
由于资源本身没有类型,所以选一个能够给资源打上合适的类型信息标签的地方。这就是应用程序资源文件(.resx)的主要作用。遵循一种叫做Resx的.NET特定的XML架构,用来持久化保存资源类型信息。
资源管理器
资源管理器:是在VS中打开.resx文件时显示的界面。
删除资源时需要从资源管理器中删除,如果直接从项目中删除仍会在元数据中保留引用,编译时会报错。
直接使用.resx文件
通过
System.Resources.RexXResourceReader类
。
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;
}
}
}
}
三、资源管理器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;