本文主要详细介绍了C#资源的资源,包括资源基础、强类型资源等。有一定的参考价值,感兴趣的朋友可以参考一下。
1. Resource Basics
(1) Manifest Resources(资源清单)
资源在编译期间被添加到程序集中。如果要将资源嵌入到程序集中,必须向项目中添加文件,这些文件将被自动复制到项目文件夹的Resources文件夹中。如果要嵌入到程序集中,还需要选择文件,将其属性“Build Action”修改为“Embedded Resources”,默认为“Content”。
一旦设置为嵌入资源,它就成为资源清单中程序集的一部分。每个程序集,无论是静态的还是动态的,都包含一个描述程序集中的元素如何相互关联的数据集。程序集清单包含这些程序集元数据。程序集清单包含指定程序集的版本要求和安全标识所需的所有元数据,以及定义程序集范围和解析对资源和类的引用所需的所有元数据。
(2) Naming Mainfest Resources
要查看正确嵌入到项目输出程序集中的文件,可以使用SDK工具ildasm.exe,它实际上是MSIL反汇编器,可以在程序集的主视图中显示所有嵌入的资源。
它显示为。ildasm中的mresource条目,资源名的显示格式如下:
默认命名空间.文件夹名.文件名
可以在项目属性页的应用程序选项卡页中更改defaultNamespace。
(3) Loading Mainfest Resources
要通过程序枚举列表,需要使用系统的GetMainifestResourceNames方法。反思。汇编类。此外,您还可以检索特定类型的程序集。例如,Assembly类还提供了GetAssembly、GetCallingAssembly、GetEntryAssembly和GetExecutingAssembly等。
//获取此类型的程序集
装配asm=this。GetType()。组装;
//枚举程序集的清单资源
foreach(ASM中的字符串resourceName。GetManifestResourceNames() ){
MessageBox。show(resourceName);
}
类型是系统的根。反射函数和访问元数据的主要方法。使用类型的成员获取有关类型声明的信息,如类的构造函数、方法、字段、属性和事件,以及部署该类的模块和程序集。
指示某个类型是唯一的类型对象;也就是说,当且仅当两个类型对象表示相同的类型时,它们才引用相同的对象。这允许使用引用等式来比较类型对象。Type表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义以及开放或封闭构造的泛型类型。物体。GetType方法返回表示实例类型的Type对象。
如果知道资源的名称,可以通过Assembly类的GetManifestResourceStream方法加载指定的清单资源。资源名区分大小写,是全名。例如:
//获取此类型的程序集
装配asm=this。GetType()。组装;
//获取保存资源的流
//来自“ResourcesSample”。' Azul.jpg '资源
//NOTE1:确保不要关闭这个流,
//否则位图对象将无法访问它
//注2:还要非常注意匹配大小写
//资源名称本身
溪流溪流=
asm。GetManifestResourceStream(' resources sample。Azul . jpg’);
//从流中加载位图
这个。BackgroundImage=新位图(流);
(4) Mainfest Resource Namespaces
如果你通过一个系统。类型对象添加到GetMainfestResourcesStream方法,它将使用这种类型的命名空间作为嵌入资源前缀的一部分,例如:
//加载资源“ResourcesSample”的流。' Azul.jpg '
流流=asm。GetManifestResourceStream(this。GetType(),' Azul . jpg ');
位图类也可以直接加载嵌入资源,例如:
//从“ResourcesApp”加载图像。' Azul.jpg '
这个。BackgroundImage=新位图(this。GetType(),' Azul . jpg ');
2. Strongly Typed Resources
清单资源中没有类型信息。虽然文件有扩展名,但是类位图类根据数据本身判断类型。
(1) Application Resources(.resx) Files
资源的主要功能(。ResX)是记录资源对应的类型信息,因为。NET特定的XML schema (resx)来保存资源类型信息。一个空的。resx文件也有42行,大部分是方案信息。该方案允许多项信息,每项信息包含名称、值、注释、类型和多用途互联网邮件扩展(MIME)类型。虽然这个文件是基于文本的,但是如果要编辑或者读取,最好还是通过VS2005的资源编辑器来完成。
中的名称/值对。resx格式封装在XML代码中,描述一个字符串或一个对象值。将字符串添加到. resx文件中时,字符串的名称嵌入到数据标记中,值包含在值标记中,如下面的示例所示。
将对象插入到. resx文件中时,将使用相同的数据和值标记来描述该项,但是数据标记应该包括类型或MIME类型说明符。类型说明符保留已保存对象的数据类型。如果对象由二进制数据组成,MIME类型描述符保留存储的二进制信息的基本类型(Base64)。
(2) Managing Resources
资源编辑器支持六种类型的资源:
A.String:在设置网格中显示字符串,带有字符串资源的名称、值和注释列。
B.图像:显示所有图像文件(包括。bmp,jpg和。gif格式)。这些文件在运行时显示为位图。此类别还包括作为图元文件公开的Windows图元文件。
C.核标准情报中心
D.音频:显示声音文件(包括。wav,wma和. mp3文件)。这些文件以字节数组的形式公开。
E.文件:显示任何不符合上述类别的文件。该视图中的项目要么是以字符串形式公开的文本文件,要么是以字节数组形式公开的二进制文件。
F.其他:显示用于添加支持字符串序列化的其他类型(例如,字体、枚举、颜色和点)的设置网格。此网格包含以下列:名称、类型、值和注释。
添加资源:
您可以通过拖放和菜单选择来添加资源。添加到。resx文件将通过资源编辑器放置在项目文件夹下的resources文件夹中,如果它们不存在,它们将被创建。如果将项目中已经存在的资源添加到。resx文件,资源不会被移动或复制到Resources文件夹,因为资源编辑器通过引用文件来管理资源文件,resx文件只存储实际库存资源的类型信息。
删除资源:
您只能从中移除或剪切资源。resx,但实际上不能删除它们,因为你操作的只是资源的元数据,而不是真正的资源文件(字符串除外,它只能被嵌入)。如果从项目中删除了资源文件,但。resx还在,编译时会有编译异常。
编辑:可以通过资源编辑器直接打开相应的编辑程序;
(3) Resource Persistance
链接的资源作为文件存储在项目中;在编译期间,从这些文件中获取资源数据,并将它们放入应用程序清单中。应用程序的资源文件(。resx)只存储磁盘上文件的相对路径或链接。对于嵌入式资源,资源数据直接存储在。resx文件作为二进制数据的文本表示形式。在任何情况下,资源数据都将被编译成可执行文件。
注意:字符串资源始终是嵌入资源,不能更改;文件始终是链接的资源,不能更改。
如何在嵌入资源和链接资源之间选择?
-
在大多数情况下,您应该坚持使用默认的链接资源。但是,在某些情况下,最好选择嵌入式资源。
嵌入式资源:
如果你需要共享应用资源。resx)文件在多个项目中,嵌入资源是最佳选择。例如,如果您有一个包含公司徽标、商标信息等的公共资源文件,那么您应该使用嵌入式资源,这样您只需要复制。resx文件,而不是关联的资源数据文件。您不能直接编辑嵌入的资源。如果您尝试编辑嵌入的资源,将会收到一条消息,提示您将该项目转换为链接资源进行编辑。这种转换是可选的,但建议这样做。它们必须导出,在外部程序中修改,然后再导入回项目中。
链接的资源:
就易用性而言,链接资源(默认)是最佳选择。您可以直接在项目中编辑资源,并且可以根据需要轻松地添加或删除资源。
-
这可以通过指定资源的Persistance属性来确定。如果该属性更改为embedded,删除资源文件将不起作用。如果将链接模式改回,将在Resources目录中重新创建资源文件。
如果在资源编辑器下管理资源,会发现资源的BuildAction,也就是build操作会变成“none”。实际上,Persistance属性只在设计期间起作用,最终的资源数据将被编译到可执行文件中。
(4) Using Typed Resources
*使用。resx文件。
使用ResXResourceReader类来访问。resx文件;
该类可以枚举XML资源(。resx)文件和流,并读取命名空间系统中存在的顺序资源名称和值对。资源如果您想要提取一个特定的项目,您需要首先搜索它。
使用(ResXResourceReader reader=
new ResXResourceReader(@ ' C:\ my resources . resx '){
foreach(读取器中的DictionaryEntry条目){
字符串s=字符串。格式(“{ 0 }({ 1 })=“{ 2 }”,
入口。钥匙,入口。Value.GetType(),条目。值);
MessageBox。演出;
}
}
*使用编译过的。resx资源
可以用三种不同的方式创建资源文件。如果您的资源只包含字符串数据,最简单的方法是手动创建一个文本文件。如果您的资源将包含对象或字符串和对象的组合,则必须创建。resx文件或。资源文件。只有。资源文件应该嵌入到公共语言运行库程序集中和附属程序集中。资源生成器(Resgen.exe)将文本(。txt)文件和基于XML的资源(resx)文件转换成。资源文件,
资源生成器Resgen.exe:
通过包装ResourceWriter类实现的方法,将. txt文件转换为. resources文件。Resgen.exe还包装了ResourceReader,允许你使用这个工具来转换。资源文件返回到。txt文件。
项目编译后。resx数据将作为嵌套资源嵌入,并放在资源列表中。例如,如果项目的默认命名空间是A,rest文件是B.resx,则嵌套的资源容器是A.B.resources,可以在ildasm中查看。可以使用ResourceReader类读取它,不支持随机访问。
使用(ResourceReader reader=
新建resource reader(' my resources . resources '){
foreach(读取器中的DictionaryEntry条目){
字符串s=字符串。格式(“{ 0 }({ 1 })=“{ 2 }”,
入口。钥匙,入口。Value.GetType(),条目。值);
MessageBox。演出;
}
}
其实你也可以直接操作。资源文件,方法是访问库存资源流。
Assembly asm=程序集。getexecutionassembly();
//加载嵌入式。资源文件
使用(
流流=asm。GetManifestResourceStream(
这个。GetType(),
my resources . resources '){
//在中查找资源。资源流
using(resource reader reader=new resource reader(stream)){
foreach(读取器中的DictionaryEntry条目){
如果(条目。Key.ToString()=='MyString' ) {
//显示字符串资源值
MessageBox。显示(' MyString=' (string)条目。值);
打破;
}
}
}
}
以上都需要多步操作,不支持随机访问,但是。NET提供了ResourceManager类来支持对资源的随机访问。
(5) Resource Manager
资源管理器类可以查找区域性特定的资源,当本地化资源不存在时提供代用资源,并支持资源序列化,它其实也就是对资源阅读器的封装。它由一个嵌入。资源文件初始化:
装配asm=这个.GetType().组装;
资源经理RES man=新资源经理(' resources sample .MyResources ',ASM);
通过资源管理器的方法,调用方可使用GetObject和GetString两种方法访问特定区域性的资源。
//加载资源示例MainForm.resx中的主窗体.资源
资源管理器RES man=新资源管理器(this .GetType());
//从资源管理器访问我的字符串字符串资源
//(这两种技术对于字符串是等价的)
string s1=(string)resman .GetObject(' MyString ');
字符串s2=雷斯曼.GetString(' MyString ');
(6) 强类型资源类
资源管理程序提供了对资源的弱类型方法GetObject来返回资源,需要进行类型转换。但是VS2005和一个自定义工具ResXFileCodeGenerator提供了对这个问题的解决办法。当一个. resx文件被保存时,VS2005会应用自定义工具将其产生一个相应的。设计师。铯文件,此文件提供了一个名字和. resx文件相同的类,这个类所处的命名空间为默认命名空间。项目路径。
命名空间资源示例{
///摘要
///strong类型资源类,用于查找本地化
///字符串等。
////摘要
//此类是由StronglyTypedResourceBuilder自动生成的
//通过雷斯根或可视化工作室之类的工具初始化。
//若要添加或移除成员,请编辑您的. resx文件,然后重新运行雷斯根
//使用/str选项,或者重新生成您的对项目。
内部类别我的资源{
静态全局:系统100 .资源。资源经理;
静态全局:系统。全球化。文化信息资源文化;
内部MyResources() {}
///摘要
///返回此使用的缓存资源管理器实例
///类。
////摘要
国际全球:
系统100 .资源。资源管理器资源管理器{
获取{
if( (resourceMan==null) ) {
全球:系统.资源。资源管理器温度=
新的全球:系统100 .资源。资源管理器(
资源示例。我的资源,
类型(我的资源)。组装);
resourceMan=临时
}
返回资源人
}
}
///摘要
///重写当前线程的当前文化属性
///使用此强类型资源类的所有资源查找。
////摘要
内部静态全局:系统。全球化。文化信息文化{
获取{ return resourceCulture}
设置{资源文化=价值}
}
}
}
由以上可以看出我的资源类型的两个特征:
a.它通过一个资源管理器类型的属性提供了对资源管理器的静态访问,就没必要写之前的创建逻辑了;b.通过一个文化属性提供了文化信息对象实现对本地化信息的静态访问;
提供的每个资源都是强类型静态只读属性。在内部实现中,每个属性都由设计器生成的资源类利用托管的资源管理者对象产生的;
//从MyResources.resx访问强类型资源
string myString=MyResources .我的字符串
Icon myIcon=MyResources .我的图标
(7) Designer Resources
VS2005提供了整个项目的资源管理。由于Resources.resx文件是从项目的属性页来进行管理的,所以VS2005将它存放到项目的性能文件夹中。当在项目中添加. resx文件时,ResXFileCodeGenerator工具会自动生成资源。设计师。cs:
命名空间资源示例。属性{
.
内部课程资源{
.
则可以如下来访问资源:消息框.显示(属性100 .资源。MyString);
该项目将自动生成一个与该窗体关联的. resx文件,并保存BackgroundImage和Icon等资源信息。属性窗口可以打开选择资源编辑器,允许您选择一个合适的图片资源。它提供了两种导入和保存资源的方式:作为本地资源;作为项目资源文件。对于窗体,本地资源嵌入在。由表单设计者自动创建并与表单关联的resx文件。如果选择本地资源,可以直接将图片导入到表单的资源文件中。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。