`
caozuiba
  • 浏览: 899461 次
文章分类
社区版块
存档分类
最新评论

为.Net程序集添加资源

 
阅读更多

在.Net结构中,程序集Assembly(也称着程序集或托管Dll)是自我描述的安装单元,它可以只包括一个PE(可移植可执行)格式的Dll或exe文件,也可以由多个文件组成,例如资源(位图、JPEG文件、字符串表等)、Dll和exe等。

其中,资源是一个范围广泛的概念,可以由多种元素组成,包括与用户交互的界面元素(如位图、图标或光标)、应用程序所需数据的自定义文件以及安装 API 使用的版本文件、菜单和对话框等都可以作为资源。

资源是可以重用的,在必要的时候也能对资源进行编辑修改,当我们这样做时,最好能将这些资源文件独立出来,以类似.Net模块的方式来构建程序集资源,使资源文件独立于源代码。这样,不但可以在不同的程序集中自由引用这些资源,还可以使非专业编程人员很容易地修改资源(当然,通过程序员,或者简单的批处理文件就可以把他们重新编译为新的资源文件),这种独立地对资源文件进行的修改不会引发对引用它的程序集的影响。同时,使用资源文件还有助于把应用程序本地化为不同的语言。辅助程序集正是因为只包含资源而不包含程序代码才广泛用于应用程序的本地化编程。

.Net结构对资源文件提供了大量支持。使用Visual Studio.Net集成开发环境IDE很容易创建资源文件,把资源添加到工程中的方法和添加窗体、类库一样简单,唯一不同的是你需要设置资源的“BuildAction”属性为“Embedded Resource”,此后,就可以使用这些资源。

创建资源



从上面可以知道,字符串表是极常见的一种资源。要创建这类资源文件,有以下两种方式:

1)、使用.Net命令行工具ResGen创建。首先创建包含资源内容的文本文件,这可以使用一般的文本编辑软件如记事本、EditPlus等。该文本文件由所需要的“键值对”组成,键的名称可以在程序中引用,设置键名后把字符串值赋予该键即可完成文件的创建。作为示例,以下语句段产生这样的资源,按下面的格式保存为userinfo.txt文件:

<ccid_nobr></ccid_nobr>

<ccid_code></ccid_code>Username="Songh";Sex="Boy";Birthday="1973-01-15";Salary="5000RMB";


然后,把文本文件转换为资源文件,这仍然通过ResGen工具来实现。执行以下语句:ResGen userinfo.txt,就将生成资源文件userinfo.resources。另外,ResGen还可以创建基于XML格式的.resX资源文件,执行以下命令ResGen userinfo.resources userinfo.resx 就将生成Xml格式的资源userinfo.resx。不过,ResGen工具不支持图象资源的操作,下面的方法就不具有这样的限制。

2)、使用ResourceWriter类

为易于创建资源文件,.Net结构提供了ResourceWriter类以支持图象等各种资源类型的创建。ResourceWriter类包含的方法能以系统默认的格式将资源写入输出文件或输出流。与方法1)不同的是,这里统一在一个过程中完成。

要创建一个资源文件,请调用ResourceWriter类的构造函数初始化类实例并至少提供流名或文件名。资源的实际内容通过调用AddResource方法来完成,AddResource方法将资源指定为名称和值对。资源的实际写入需要调用Generate方法来实现,不过,在调用Close方法关闭该ResourceWriter时将隐式调用Generate方法。

ResourceWriter.AddResource()方法向要写入资源的列表中添加资源。在创建ResourceWriter类实例后,该方法可以添加至多2GB的资源,下面的重载方法之一用于向资源列表中添加string资源:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>public void AddResource(   string name,//键名   string value//值);


在这里,AddResource方法的第一个参数指定键名称,第二个参数指定值。多次调用该方法就可以完成字符串表的创建。另外,添加图象资源可以通过实例化类Image来实现(这时,请添加System.Drawing名称空间)。

下面的代码段生成包含字符串表和图象的资源文件userinfo.resources。

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>using System;using System.Resources;using System.Drawing;public class RS{  public static void Main()  {    ResourceWriter rw=new ResourceWriter("userinfo.resources");//提供文件名以初始化ResourceWriter类实例。  Image image=Image.FromFile("photo.gif");//实例化Image类      rw.AddResource("Photo",image);//添加图象      rw.AddResource("Username","songh");//添加字符串      rw.AddResource("Sex","boy");//添加字符串      rw.AddResource("Birthday","1973-01-15");//添加字符串      rw.AddResource("Salary","5000RMB");//添加字符串      rw.Close();//关闭ResourceWriter并隐式调用Generate()方法完成资源文件写入磁盘文件。   }}


上面的代码首先打开图形文件photo.gif,创建一个Image对象。这样做时,这个图形文件必须存在于工程可执行文件的目录(通常是项目的/Bin/Debug目录)下,或者在Image.FromFile()的方法参数中指定图象的完整路径。然后,通过几次调用AddResouce()方法把字符串资源添加到ResourceWriter对象中。最后,调用Close()方法关闭ResourceWriter对象并隐式调用Generate()方法把资源写入文件userinfo.resources。

编译以上代码并运行就将创建资源文件userinfo.resources。

以上两种方式生成的资源文件均可以作为一个外部文件添加到程序集中,或者内嵌到Dll或exe中。下面继续说明如何在Windows应用程序使用资源文件。

使用资源文件


使用Visual Studio.Net集成开发环境IDE,可以把很容易把资源文件添加到程序集中。只需要在创建的工程中添加已经存在的资源文件,简单设置其属性就可将资源文件嵌入该程序集。下面通过一个C# Windows控制台实例来说明任何使用上面创建的userinfo.resources资源文件。

首先,创建C# Windows Console项目ResourceUserinfo,打开"项目/添加现有项",找到前面创建的资源文件Userinfo.resources添加到这个工程中;

然后,选择这个资源文件,将属性BuildAction(生成操作)设置为Embedded Resource(嵌入的资源),这样,资源文件就可以嵌入到输出的程序集中。

现在,你可以使用这个资源文件了。System.Resources名称空间中的ResourceManager类提供在运行时方便地访问特定资源的途径。具体地可以通过GetObject和GetString方法来实现,以键名为参数就将返回对应的值。

ResourceManager类的构造函数初始化ResourceManager类的新实例,其重载方法之一查找包含在一些文件中的资源,这些文件是使用给定的 Assembly 从指定根名称导出的。

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>public ResourceManager(   string baseName,   Assembly assembly)


其中,参数baseName表示资源的根名称。根名称由应用程序名称空间和资源文件名(不带扩展名)组成。这样,该例中资源的根名称应该是:UserinfoResource.Userinfo,通过调用GetManifestResourceNames()方法也可编程获取该名称。

另一个参数assembly表示的是当前的主程序集,本例中的主程序集其实也是正在执行的程序集。获取正在执行程序集的一个简单方法是调用Assembly.GetExecutingAssembly()方法。

在获取ResourceManager实例后,通过指定键名,就可以获得对应的资源。

下表是程序中使用的部分控件:

<ccid_nobr></ccid_nobr>
类别 TextBox TextBox TextBox TextBox PictureBox
名称 username sex birthday salary photo



这些控件均可直接从工具箱拖放到设计器中。

完整的源代码为:

<ccid_nobr></ccid_nobr>

<ccid_code></ccid_code>using System.reflection;  using System.Resources;  private System.Resources.ResourceManager rm;  public Form1(){  InitializeComponent();  Assembly assembly=Assembly.GetExecutingAssembly();//获取当前主程序集  Rm=new ResourceManager("ResourceUserinfo.Userinfo",assembly);//实例化资源管理类photo.iamge=(Image)rm.GetObjetct("Photo");username.Text=rm.GetString("Username");sex.Text=rm.GetString("Sex");birthday.Text=rm.GetString("Birthday");salary.Text=rm.GetString("Salary");}


运行这段代码,就可以取出资源文件内容。
分享到:
评论

相关推荐

    asp.net中资源文件的使用

    为.Net程序集添加资源,就可实现资源重用等功能。使用Visual Studio.Net集成开发环境IDE很容易创建资源文件,把资源添加到工程中的方法和添加窗体、类库一样简单,只是你需要设置资源的“BuildAction”属性为...

    RefExplorer:显示 .NET 程序集之间依赖关系的工具

    它非常易于使用:只需将要检查的程序集添加为入口点即可。 您甚至可以从全局程序集缓存 (GAC) 添加一个完整的文件夹或程序集。 如果任何引用损坏,则会显示详细的错误消息,并在图表中相应地标记位置。 开发环境 ...

    PowerShell入门教程之访问.Net程序集、COM和WMI实例

    PowerShell可以设计的大而全,重新实现一切;...基本步骤如下:1、添加类所在程序集;2、创建类的实例;3、调用实例的函数或者属性。以StringBuilder类为例,代码如下: 代码如下: Add-Type -Assembl

    Netfuser:.NET程序集的后生成处理框架

    网友Netfuser是用于.NET程序集的生成后处理的框架。 Netfuser当前允许: 将多个程序集合并为一个将程序集嵌入为.NET资源防止逆向工程: 混淆元数据名称(命名空间,类型和类型成员) 模糊控制流混淆字符串提供您自己...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    2.3.1 添加程序集引用 2.3.2 智能感知和大纲显示 2.3.3 Visual Studio 2010改进 2.4 编码模型 2.4.1 代码隐藏文件如何与页面连接 2.4.2 控件标签如何与页面变量连接 2.4.3 事件如何与事件处理程序连接 ...

    asp.net知识库

    体验.net2.0的优雅(3) -- 为您的 SiteMap 添加 控制转发功能 GridView控件使用经验 ASP.NET 2.0:弃用 DataGrid 吧,有新的网格控件了! ASP.NET2.0控件一览---标准控件(1) ASP.NET2.0控件一览---标准控件(2) ASP...

    ado[1].net中文手册 学习 ado.net的重要资料

    为 .NET 数据提供程序编写通用代码:提供有关如何使用 ADO.NET 所提供的通用接口来编写一组对于任何 .NET 数据提供程序都将运行的代码的信息。 ADO.NET 示例应用程序:提供 ADO.NET 应用程序的示例,该示例从数据库中...

    IntelliLock 1.4.1.0 绿色破解版 .net混淆工具

    嵌入式授权文件:授权文件可以作为程序集的内嵌资源存储 添加自定义数据到授权文件 限制授权文件的使用期限,实现基于订阅/时间的授权期限…… 通过自有的授权服务器验证/激活授权文件 全面的授权管理 管理您的...

    ASP.NET4高级程序设计(第4版) 3/3

    2.3.1 添加程序集引用 33 2.3.2 智能感知和大纲显示 35 2.3.3 Visual Studio 2010改进 37 2.4 编码模型 42 2.4.1 代码隐藏文件如何与页面连接 44 2.4.2 控件标签如何与页面变量连接 44 2.4.3 事件如何与...

    在.NET中读取嵌入和使用资源文件的方法

    resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源。 下面分别详述这两种方法 一、使用GetManifestResourceStream读取嵌入资源 1、加入资源文件 直接把要嵌入到程序集的资源文件加入到...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    4.1.2 程序集 215 4.1.3 类型 215 4.2 版本化与部署 216 4.2.1 对版本化更好的支持 216 4.2.2 major.minor.build.revision版本介绍 217 4.2.3 更好的部署 217 4.3 跨语言集成 218 4.3.1 通用类型系统 ...

    ASP.NET的网页代码模型及生命周期

    ASP.NET单文件页模型在创建并生成时,开发人员编写的类将编译成程序集,并将该程序集加载到应用程序域,并对该页的类进行实例化后输出到浏览器。可以说,.aspx页面的代码也即将会生成一个类,并包含内部逻辑。在...

    .Net 脱壳 反混淆神器De4dot-3.1.41592最新版

    有些模糊处理一个Win32 PE等包装.NET程序集里面的.NET反编译器无法读取该文件。 移除大多数/所有的垃圾类添加混淆。 修复了一些的peverify错误。许多混淆器是马车和创建无法验证的代码错误。 还原类型的方法的参数和...

    配置Spring.Net所用的dll文件

    该资源是配置Spring.Net所需的dll文件,以及在出现如果出现未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一个依赖项。系统找不到指定的文件。需要添加对应的程序集

    .NET设计规范约定 惯用法与模式

     3.3 程序集和DLL的命名  3.4 名字空间的命名  3.5 类、结构和接口的命名  3.5.1 泛型类型参数的命名  3.5.2 常用类型的命名  3.5.3 枚举类型的命名  3.6 类型成员的命名  3.6.1 方法的命名  3.6.2...

    ClearScript:用于向.NET应用程序添加脚本的库。 支持V8(Windows,Linux,macOS)和JScriptVBScript(Windows)

    描述 ClearScript是一个库,可轻松将脚本添加到.NET应用程序。 目前,它支持JavaScript(通过和 )和 。...从脚本代码导入类型和程序集的可选支持 主机可以调用脚本函数并直接访问脚本对象 全面支持脚本调试 支持

Global site tag (gtag.js) - Google Analytics