一、 ** 导言 ** ... 3
** 二、软件环境 ** ... 3
** 三、资源文件 ** ... 3
** 四、创建资源文件 ** ... 3
** 五、使用资源文件 ** ... 6
** 5.1 ** ** 在命令行编译中使用资源文件 ** ... 6
** 5.2 ** ** 在Visual Studio.NET ** ** 中使用资源文件 ** ... 8
** 六、结束语 ** ... 9
一、 导言 ** **
Microsoft 的 .NET 从 2002 年 1 月 15 日 第一版发布到今天,已经得到了广泛的使用;从刚推出时国内相关书籍种类寥寥,到今天 .NET 的相关书籍的大大丰富,已有越来越多的人——初学者或者有经验的程序员,在学习、应用 .NET 。本文面向对 .NET 有些了解的者,以 C# 为例,介绍如何在 .NET 编程环境中,把资源文件(如包含图片、字符串等的资源文件)嵌入到程序集中。这里的所说的程序集可以是 EXE 文件,也可是供其他程序调用的 DLL 文件。
本文不涉及国际化、本地化、打包和部署资源方面的内容,有兴趣的读者可以查阅 .NET Framework SDK 文档。
** 二、软件环境 ** ** **
运行本文中的程序需要如下软件环境: Windows 2000/XP, .NET Framework SDK 。本文中的代码在如下环境中运行通过: Windows XP Professional, .NET Framework V1.1 , Visual Studio.NET 2003 。
** 三、资源文件 ** ** **
几乎每一个生产性应用程序都需要使用资源。资源是在逻辑上由应用程序部署的任何非可执行数据。资源可以在应用程序中作为错误信息显示,或者作为用户界面的一部分显示。资源可以包含多种形式的数据,包括字符串、图像和持久的对象。通过在资源文件中存储数据,无需重新编译整个应用程序即可更改数据。
在 .NET 中,有文本文件 .resx 文件和 .resources 文件三种资源文件。如果资源将只包含字符串数据,则文本文件是最简单的选择。如果资源将包含对象或字符串与对象的组合,则必须创建 .resx 文件或 .resources 文件。注意,只有 .resources 文件才应能嵌入在公共语言运行库程序集和附属程序集中。
** 四、创建资源文件 ** ** **
创建资源文件,有编写代码以及利用名为 ResEditor 的软件这两种途径。以下分述之。
** 4.1 ** ** 编写代码创建资源文件 **
.NET Framework 类库中提供了 ResourceWriter 类来创建 .resources 文件。 ResourceWriter 类包含在 System.Resources 命名空间中。 ResourceWriter 类以系统默认的格式将资源写入输出文件或输出流。
在 ResourceWriter 类中使用 AddResource 方法将资源指定为名称和值对。资源名在用于查找时是区分大小写的,但是,为更易于支持创作工具和帮助消除错误, ResourceWriter 将不允许使用仅大小写不同 .resources 文件名。
若要创建一个资源文件,请用唯一的文件名创建 ResourceWriter ,至少调用 AddResource 一次,再调用 Generate 将该资源文件写入磁盘,然后调用 Close 关闭该文件。
下面的示例将若干个字符串写入到 myResources.resources 文件中。
// 例 1
// 本示例代码来自 .NET Framework SDK 文档
//CreateResTest_1_1.cs
using System;
using System.Resources;
public class WriteResources {
public static void Main (string[] args) {
// Creates a resource writer.
IResourceWriter writer = new ResourceWriter("myResources.resources");
// Adds resources to the resource writer.
writer.AddResource("String 1", "First String");
writer.AddResource("String 2", "Second String");
writer.AddResource("String 3", "Third String");
// Writes the resources to the file or stream, and closes it.
writer.Close();
}
}
编译代码: csc CreateResTest_1_1.cs , 编译成功后,则在工作目录里生成名为 CreateResTest_1_1.exe 的可执行文件;运行该文件,在工作目录中生成名为 string.resources 的资源文件。
以上给出了字符串写入资源文件的例子,下面的示例尝试将若干张图片嵌入到资源文件 myResources.resources 中。
// 例 2
//CreateResTest_1_2.cs
using System;
using System.Drawing;
using System.Resources;
public class CreatPicResource
{
public static void Main ()
{
// Creates a resource writer.
ResourceWriter rw = new ResourceWriter ( "picture.resources" );
// 从指定的文件创建 Image 对象 .
//_Bird.png 、 _Butterfly.png 文件在当前工作目录
Image _Bird_Pic = Image.FromFile ( "_Bird.png" );
Image _Butterfly_Pic = Image.FromFile ("_Butterfly.png" );
// 把 Image 对象添加到资源文件中
//ResourceWritername.AddResource(string name, object value) ;
// 其中 name 为资源名, value 为资源值
rw.AddResource ( "Bird" , _Bird_Pic );
rw.AddResource ( "Butterfly" , _Butterfly_Pic );
// Writes the resources to the file or stream, and closes it.
rw.Generate ();
rw.Close ();
}
}
确保 _Bird.png 和 _Butterfly.png 文件在当前工作目录。编译代码: csc CreateResTest_1_2.cs , 如编译成功,生成 CreateResTest_1_2.exe ;运行该文件,则生成资源文件 picture.resources 。
** 4.2 ** ** 利用资源编辑器 (ResEditor) 创建资源文件 **
.NET Framework 中包含一个称为 ResEditor 的示例应用程序,它可帮助您创建和编辑资源文件。 ResEditor 可以创建二进制资源文件 (.resources) 以及 XML 资源文件 (.resX) 。
** 生成 ResEditor **
ResEditor 以源代码的形式随 .NET Framework SDK 一起提供。必须先使用提供的批处理文件生成 ResEditor ,然后才能使用它。找到 \SDK\v1.1\Samples\Tutorials\resourcesandlocalization\reseditor 文件夹,运行批处理文件 build.bat ,编译成功后,生成 ResEditor.exe 应用程序。在笔者所用的环境中,路径如下:
\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Tutorials\resourcesandlocalization\reseditor 。
生成 ResEditor 后,您可以使用它创建、编辑资源文件。
** 使用 ResEditor 创建资源文件 **
启动 ResEditor 应用程序。
从“添加”下拉菜单中选择要添加的资源类型。
在“添加”文本框中键入资源的名称,然后单击“添加”按钮,将资源项添加到文件中。
在主窗格中,单击资源名称旁边的单元格以指定一个值。
对于“字符串”资源,在该框中键入相应的字符串。
对于“图像”和其他类型的资源,请浏览到相应的文件。
对于要添加到文件中的每个资源,重复步骤 3 、 4 、 5 。
在“文件”菜单中,单击“另存为”以保存文件。您可以将文件保存为 .resources 文件,也可以保存为 .resX 文件。
** 编辑现有资源文件 **
可以使用 ResEditor 编辑现有资源文件( .resources 文件和 .ResX 文件)。使用方法如下:
启动 ResEditor 应用程序。
在“文件”菜单上单击“打开”。
在“打开资源文件”对话框中浏览到相应的资源文件。
资源文件打开,并且它包含的资源显示在主窗格中。
如果要更改任何资源的值,请单击资源名称旁边的单元格并指定正确的值。
对于“字符串”资源,在该框中键入相应的字符串。
对于“图像”和其他类型的资源,请浏览到相应的文件。
如果要重命名资源,请执行以下操作:
通过单击要重命名的资源,突出显示它。
在“重命名”文本框中键入新名称。
单击“重命名”按钮,应用新名称。
如果要删除资源,请通过单击该资源将其突出显示,然后从“资源”菜单中选择“删除”。
编辑完资源文件后,选择“文件”,然后选择“另存为”以保存文件。
** 五、使用资源文件 ** ** **
创建了资源文件后,很容易将它们添加到您的应用程序中。二进制资源文件 (.resources) 或 XML 资源文件 (.resX) 可直接添加到您的项目中。当编译项目时,同时也会编译资源文件。您可以通过使用 ResourceManager 类检索嵌入的资源(即已经编译到程序集中的资源)。
如果您希望经常更新程序中的资源而无需重新编译整个解决方案,可创建一个资源程序集。
** 5.1 ** ** 在命令行编译中使用资源文件 ** ** **
这里使用例 2 代码生成的资源文件 picture.resources 作为示例。示例代码 CreateResTest_2_1.cs 如下:
// 例 3
//CreateResTest_2_1.cs
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Resources;
using System.Reflection;
public class TestResForm : System.Windows.Forms.Form
{
private PictureBox picBox1;
private PictureBox picBox2;
public TestResForm()
{
picBox1 = new PictureBox();
picBox1.Location = new Point(0,0);
picBox1.Width = ResContainer.Instance.ButterflyImage.Width;
picBox1.Height = ResContainer.Instance.ButterflyImage.Height;
picBox1.Image = ResContainer.Instance.ButterflyImage;
picBox2 = new PictureBox();
picBox2.Location = new Point(0,100);
picBox2.Width = ResContainer.Instance.BirdImage.Width;
picBox2.Height = ResContainer.Instance.BirdImage.Height;
picBox2.Image = ResContainer.Instance.BirdImage;
Controls.Add(picBox1);
Controls.Add(picBox2);
this.Size = new Size(200,200);
}
public static void Main ()
{
Application.Run(new TestResForm());
}
}
public class ResContainer
{
// Data Members
private Image _BirdImage = null;
private Image _ButterflyImage = null;
private static ResContainer _instance = new ResContainer();
// Constructor
private ResContainer()
{
try
{
ResourceManager rm = new ResourceManager( "picture",
Assembly.GetExecutingAssembly() ) ;
_ButterflyImage = (Image)( rm.GetObject ( "Butterfly" ) );
_BirdImage = (Image)( rm.GetObject ( "Bird" ) );
}
catch(Exception ex)
{
ex.ToString();
}
}
// Properties
public static ResContainer Instance
{
get{
return _instance;
}
}
public Image ButterflyImage
{
get{
return _ButterflyImage;
}
}
public Image BirdImage
{
get{
return _BirdImage;
}
}
}
在控制台下,切换工作目录到当前代码、资源文件所在目录,运行 CSharp 编译器 csc (具体使用请参见 .NET Framework SDK )。确保资源文件存在且正确,输入: csc /t:winexe /resource:picture.resources UseResTest_2_1.cs ,编译成功后得到 UseResTest_2_1.cs.exe 。
** 5.2 ** ** 在 Visual Studio.NET 中使用资源文件 ** ** **
向您的项目添加资源文件:从“项目”菜单中,选择“添加现有项”。“添加现有项”对话框打开。浏览到要添加到项目中的资源文件。它可能是 .resources 文件,也可能是 .resX 文件。选择适当的文件。
在“生成”菜单中,选择“生成解决方案”将资源文件嵌入到您的已编译项目中。注意,如果对已添加到项目中的资源文件作出更改,需要在“生成”菜单中,选择“重新生成解决方案”,使更改生效。
至于代码,和 UseResTest_2_1.cs 略有不同。假设所在项目的命名空间为 project1 ,则需要把 ResContainer 构造方法中的:
ResourceManager rm
= new ResourceManager( "picture", Assembly.GetExecutingAssembly() ) ;
改为:
ResourceManager rm = new <SPAN style="mso-spaceru