转自:笨笨.Netui
Dotnet中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,做为嵌入资源,在代码中经过Assembly的 GetManifestResourceStream方法获取资源的Stream。另外一种方法是在项目中加入. resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源。编码
下面分别详述这两种方法spa
1、 使用GetManifestResourceStream读取嵌入资源
一、 加入资源文件
直接把要嵌入到程序集的资源文件加入到项目中,能够加在项目的根目录,能够加在项目的任何目录中。code
二、 设置资源文件的“BuildAction”属性
将嵌入资源文件的“BuildAction”属性设置为“Embedded Resource”xml
三、 代码中使用嵌入资源
//
得到正在运行类所在的名称空间
Type type
=
MethodBase.GetCurrentMethod().DeclaringType;
string
_namespace
=
type.Namespace;
//
得到当前运行的Assembly
Assembly _assembly
=
Assembly.GetExecutingAssembly();
//
根据名称空间和文件名生成资源名称
string
resourceName
=
_namespace
+
"
.directory.BitmapManifest.bmp
"
;
//
根据资源名称从Assembly中获取此资源的Stream
Stream stream
=
_assembly.GetManifestResourceStream(resourceName);
Image myImage
=
Image.FromStream(stream);
注意资源名称的组成规则:对象
项目默认名称空间.资源在项目中所在目录.资源文件名 blog
上面代码中BitmapManifest.bmp位图就在项目的directory目录下。若是资源文件直接在项目根目录,则为项目默认名称空间.资源文件名
ci
再给一个xml资源的例子:资源
//
得到正在运行类所在的名称空间
Type type
=
MethodBase.GetCurrentMethod().DeclaringType;
string
_namespace
=
type.Namespace;
//
得到当前运行的Assembly
Assembly _assembly
=
Assembly.GetExecutingAssembly();
//
根据名称空间和文件名生成资源名称
string
resourceName
=
_namespace
+
"
.XMLFileTest.xml
"
;
//
根据资源名称从Assembly中获取此资源的Stream
Stream stream
=
_assembly.GetManifestResourceStream(resourceName);
XmlDocument xmlDoc
=
null
;
xmlDoc
=
new
XmlDocument();
xmlDoc.Load(stream);
2、 使用. resx资源文件嵌入资源
一、 新建资源文件
在项目中新建一个资源文件,资源文件以.resx为后缀,同时还会新建一个跟资源文件同名的Designer.cs文件。字符串
其实资源文件最大的用处是用来作多语言版本的软件时保存不一样语言的资源,好比不一样语言的菜单文本,能够把不一样语言的字符串放在同一个资源类型下的不一样资源包中,程序运行时根据运行时系统的culture选择不一样的包显示不一样语言的字符串。
新建了资源文件后就能往资源文件中添加资源文件:

Figure.1 .resx资源文件可嵌入的资源类型
资源中能够添加字符串、位图、图标、音频、文件等等的资源。
添加的资源都会被保存在项目的Resources文件夹中。
二、 设置资源文件的“BuildAction”属性
Resources文件夹中的全部资源文件的“BuildAction”属性设置为“Embedded Resource”。
三、 资源存在方式
.resx资源文件管理的资源能够用两种存在形式,一种是以通常的文件形式存在于Resources文件夹中,另外一个是通过Base64编码后嵌入到.resx资源文件中。

Figure.2 .resx资源文件中资源存在方式
打开.resx资源文件,选择资源,在属性中Persistence属性决定资源的存在形式。资源的两种存在形式,在代码中调用都是同样的。
四、 代码中使用嵌入资源
//
得到正在运行类所在的名称空间
Type type
=
MethodBase.GetCurrentMethod().DeclaringType;
string
_namespace
=
type.Namespace;
//
获取当前主程序集
Assembly currentAssembly
=
Assembly.GetExecutingAssembly();
//
资源的根名称
string
resourceRootName
=
_namespace
+
"
.ResourceTest
"
;
//
实例化资源管理类
ResourceManager resourceManager
=
new
ResourceManager(resourceRootName, currentAssembly);
//
根据资源名得到资源对象
Icon myIcon
=
(Icon)resourceManager.GetObject(
"
IconTest
"
);
注意资源的根名称的规则:
资源的根名称就是这个资源文件类的全名称。
打开.resx资源文件相应的Designer.cs文件能看到资源类的全名称:名称空间.资源类名。
资源名就是某个资源在.resx资源文件中的名称。
打开.resx资源文件能够看到各个资源的名称。上面图中图标文件IconTest.ico的名称是IconTest。
若要检索“字符串”资源,请调用 GetString 方法。
若要检索其余类型的资源,请调用 GetObject 方法,并将获得的资源显式转换成对应的类型。
五、 多语言的资源应用
//
获得当前语言环境
CultureInfo ci
=
Thread.CurrentThread.CurrentCulture;
//
CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;
Icon myIcon
=
(Icon)resourceManager.GetObject(
"
IconText
"
, ci);