一、导言

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 ResourceManager(" project1.picture",

Assembly.GetExecutingAssembly() ) ;

如果不加上命名空间,则生成解决方案时并不会出现任何错误提示,而在编译、执行会出现错误。奇怪的时执行完ResourceManager rm

= new ResourceManager( "picture", Assembly.GetExecutingAssembly() ) ; 这一行时rm并不为null,也不抛出异常,就这样悄悄的进行下去了。执行到下一句:

_ButterflyImage = (Image)( rm.GetObject ( "Butterfly" ) );

异常抛出,异常信息如下:“System.Resources.MissingManifestResourceException: Could not find any resources appropriate for the specified culture (or the neutral culture) in the given assembly. Make sure \"picture.resources\" was correctly embedded or linked into assembly \"Project1\"”。

究其原因,应该是IDE捣的鬼,把后添加如的资源文件也纳入其命名空间中。试把项目的默认命名空间删除(右键单击项目,属性,常规),则资源文件前就不需要加上命名空间了。

resgen工具:

resgen.exe   /useSourcePath   /compile   "d:\My   Document\My   Program\DirectoryCompare\DirectoryCompare\MainForm.resX","Debug\DirectoryCompare.MainForm.resources"

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/weajan/archive/2009/12/10/4980484.aspx

C#资源文件的使用方法相关推荐

  1. Android中String资源文件的format方法

    很多时候我们感性Google在设计 Android时遵守了大量 MVC 架构方式,可以让写公共代码.美工和具体逻辑开发人员独立出来.有关Android 的资源文件values/strings.xml中 ...

  2. java获取资源文件的各种方法

    1.在test环境中获取xml: @Test     public void testFindUserById() throws Exception{ String resource = " ...

  3. 易优cms load 加载资源文件标签使用方法

    [基础用法] 标签:load 描述:资源文件加载,比如:css/js 用法: {eyou:load href='/static/js/common.js' ver='on' /} 属性: file=' ...

  4. nginx服务器资源路径配置文件,查看nginx配置文件路径和资源文件路径的方法

    本文关键详细介绍了查询nginx配置文件路径和資源文件路径,文中给大伙儿详细介绍的十分详尽,对大伙儿的学习培训或工作中具备一定的参照效仿使用价值,必须的盆友能够参照下 查询nginx配置文件路径 根据 ...

  5. Struts2的国际化(一)-国际化资源文件的配置及国际化信息的访问

    一.概述: 1)国际化是一种技术:在程序设计领域,把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化. 2)本地化是一个动作:与国际化对应的是本地化,指让一个具备国际 ...

  6. Qt中使用qrc管理和使用资源文件

    qrc资源文件一直有点搞不清楚,特别是前缀,到底加什么,讲的不太清楚,我的项目也因此搞的很乱.现在总结一下. 1. 比如qss资源文件,我在Resources文件夹下新增一个qss.qrc文件,这个文 ...

  7. Qt中使用qrc管理和使用资源文件(转)

    qrc资源文件一直有点搞不清楚,特别是前缀,到底加什么,讲的不太清楚,我的项目也因此搞的很乱.现在总结一下. 1. 比如qss资源文件,我在Resources文件夹下新增一个qss.qrc文件,这个文 ...

  8. Delphi 资源文件( .res)

    一.    现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便程序需要的时候调用.资源是 ...

  9. 使用wpf引入资源文件,RichTestBox加载rtf文件

    最近临时被拉来负责公司客户端界面的一些开发,因为之前做过一些界面相关的开发内容,所以本想着应该分分钟就搞定,却不曾想浪费了我好几天.这里我吐槽一句,我佩服(wpf)是真不好用,尤其是对于之前没接触过这 ...

  10. vue html引入资源dev下404,webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)...

    最近在使用webpack + vue做个人娱乐项目时,发现npm run build后,css js img静态资源文件均找不到路径,报404错误...网上查找了一堆解决办法,总结如下 一.首先修改c ...

最新文章

  1. PHP 捕获全局异常
  2. 令人惊叹的前端路由原理解析和实现方式
  3. 如何获取并分析Bluetooth HCI层Command Packet和Event Packet包
  4. 已知思科ASA设备漏洞仍在其新版本中存在
  5. stream of java_Java 8 新特性-Stream更优雅的处理集合入门
  6. 给RABBITMQ发送消息时,设置请求头HEADER
  7. VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__())
  8. 2021全国计算机二级知识点,2021年度Dlypeq全国计算机等级考试二级公共基础知识点总结.doc...
  9. AfxGetMainWnd 函数
  10. 3d工口医Android,3d口工医完整版
  11. 网易视频云:为何说张三丰是个优秀的程序员?
  12. 应用程序配置不正确解决方法
  13. 生活随笔:人心难测,伤心地离开
  14. [sdx12]sdx12从板子导出fdt文件转化为dtsi文件方法
  15. C++ 获取系统当前时间
  16. Oracle设置主键报错 ORA-02437: 无法验证 (DENGCHAO.TEST) - 违反主键
  17. 详解WPF 4 DataGrid控件的基本功能
  18. 2t移动硬盘linux无法格式化,移动硬盘无法格式化怎么办实际解决方法
  19. husky gazebo
  20. (Tekla Structures二次开发)创建布置图

热门文章

  1. 六石管理学: 头目们是如何忽略产品质量的
  2. 全网首发:WORD应该是布局绘制二合一
  3. 距离感应器黑屏,如何一直亮屏
  4. LINUX下载编译libspeex/libspeexdsp
  5. 狐狸抓老鼠,为何东北向才会成功
  6. 用科学数据求真:地月之间不可能电视直播
  7. 物件导向比面向对象更准确
  8. java 停止定时器_实例助解java定时器设置及停止的方法
  9. java int 原子_java中的原子操作类AtomicInteger及其实现原理
  10. access字段类型varchar_Access SQL语句创建表对应的数据类型名称