`

为.Net程序集添加资源

阅读更多

作者:宋华    本文选自:赛迪网  2002年12月06日

在.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_code>Username="Songh";
Sex="Boy";
Birthday="1973-01-15";
Salary="5000RMB";</ccid_code>
</ccid_nobr>

然后,把文本文件转换为资源文件,这仍然通过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_code>public void AddResource(
   string name,//键名
   string value//值
);</ccid_code>
</ccid_nobr>

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

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

<ccid_nobr>
<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()方法完成资源文件写入磁盘文件。
   }
}</ccid_code>
</ccid_nobr>

上面的代码首先打开图形文件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_code>public ResourceManager(
   string baseName,
   Assembly assembly
)</ccid_code>
</ccid_nobr>

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

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

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

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

<ccid_nobr>

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



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

完整的源代码为:

<ccid_nobr>

<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");
}</ccid_code>
</ccid_nobr>

运行这段代码,就可以取出资源文件内容。

分享到:
评论

相关推荐

    VS中.NET开发添加程序集引用

    本文将深入探讨如何在VS中添加.NET程序集引用,并详细讲解其工作原理。 程序集是.NET Framework的基本模块,它包含了执行.NET应用程序所需的所有元数据和IL(Intermediate Language)代码。程序集可以是DLL(动态...

    .Net程序集信息提取器

    .Net程序集是.NET框架的核心组成部分,它是.NET应用程序的构建块,包含了代码、元数据以及执行.NET应用程序所需的所有资源。本文将详细探讨.Net程序集信息提取器的工作原理,以及它如何利用反射机制来揭示程序集中的...

    ILMergeGUI 合并多个.net程序集和exe文件工具和源码

    4. **配置选项**:根据需求调整ILMerge的参数,例如是否包含嵌入的资源,是否忽略特定类型的程序集等。 5. **执行合并**:点击“合并”按钮,ILMergeGUI将处理所有设置,生成合并后的单一文件。 在ILMergeGUI压缩包...

    调用.net程序集中的方法

    为了使得Biztalk Server能够调用.NET程序集,需要在工程中添加对"MyFunction.dll"的引用。然后在AssignOutMsg的表达式中,直接使用这个方法处理输入消息的UserId字段,并将结果赋值给输出消息的RoleName字段。 最后...

    .NET程序反编译工具 - ILSpy ver 1.0.0.1000

    ILSpy的全称是Intermediate Language Spy,其核心功能是对.NET程序集进行反编译,将已编译的.NET程序集(.dll或.exe文件)转换回源代码形式,便于开发者查看和理解代码逻辑。它不仅能展示元数据信息,还可以解析程序...

    .net c#动态创建程序集、类、属性、方法等

    在.NET中,程序集是包含类型和资源的物理单元,是CLR执行的基本模块。C#通过System.Reflection.Emit命名空间提供的类(如AssemblyBuilder、ModuleBuilder)可以动态创建程序集。首先,需要创建一个AssemblyBuilder...

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

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

    Asp.Net程序设计教程与实训(C#语言版)

    整体而言,《Asp.Net程序设计教程与实训(C#语言版)》不仅适合高职高专、大中专院校学生作为教材使用,也为软件开发人员提供了宝贵的自学资源,通过系统学习本书内容,可以全面掌握ASP.NET程序设计的核心技术和最佳...

    vb.net嵌入和调用资源文件示例.zip

    资源文件是程序中独立于源代码的文件,它们可以被嵌入到程序集(.exe或.dll)中,也可以单独保存为外部文件。嵌入资源在编译时会被打包到程序集中,便于随程序一起分发,而外部资源则允许程序运行时动态加载。 在VB...

    ASP.NET程序设计实务.rar

    本教程将深入探讨ASP.NET程序设计的各个方面,旨在帮助初学者和有经验的开发者提升在该领域的技能。 在“ASP.NET程序设计实务”中,你将学习到以下关键知识点: 1. **基础概念**:理解ASP.NET的架构,包括页面生命...

    .net程序打包软件

    2. 添加输出:在新建的安装项目中,添加主项目的输出,包括Release或Debug版本的程序集。 3. 添加依赖:如果程序依赖于其他DLL或其他文件,需将其添加到安装项目中。 4. 设置启动菜单:定义程序在用户系统中的快捷...

    .NET程序集的Shell扩展

    例如,通过Shell扩展,可以为.NET程序集添加特定的图标,当用户在资源管理器中浏览时,能一眼看出这是.NET程序集而不是普通的二进制文件。此外,还可以在右键菜单中添加自定义操作,如查看程序集的元数据信息、反...

    .Net 创建安装程序

    通常,安装项目会包含程序集、配置文件、图标、本地化资源等文件,它们共同构成了完整的安装程序。 总的来说,创建.NET安装程序是一个涉及多个步骤和组件的过程,涵盖了项目打包、依赖管理、用户界面设计、安装逻辑...

    ASP.NET教程全集

    ASP.NET是微软公司推出的一种用于构建Web应用程序的框架,它基于.NET Framework,为开发者提供了丰富的功能和工具,使得创建动态网站、Web应用和Web服务变得更加简单。本教程全集将全面介绍ASP.NET的基础知识和高级...

    NET Resourcer(编辑各类资源)

    .NET Resourcer是一款专门用于查看、编辑和导出.NET程序集(assembly)中资源的工具。它为开发者提供了一个直观的界面,以便于管理和修改嵌入到.NET应用程序中的各种资源,如文本、图像、图标、声音文件等。下面将...

    .net程序反编译软件

    它支持反编译.NET程序集,显示类、方法、属性和事件等结构,并可以导出到多种.NET语言。此外,Reflector还允许用户添加插件来扩展其功能,如反编译ASP.NET页面或分析性能计数器。 总而言之,.NET程序反编译软件是...

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

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

    杨晓光《Visual C#.NET程序设计》源代码

    《Visual C#.NET程序设计》是杨晓光先生编著的一本深入介绍C#编程的书籍,这本书籍的源代码提供了丰富的学习资源,涵盖了C#编程的多个核心领域。通过这些源代码,读者可以深入理解C#语言的基础,以及如何在实际项目...

    .NET程序实现多语言

    在这个示例中,我们首先创建了一个 `ResourceManager` 实例,并指定了资源所在的命名空间和程序集。然后,我们获取当前用户的界面文化名称,并使用此名称从资源文件中加载相应的字符串。这样,无论用户的语言设置...

Global site tag (gtag.js) - Google Analytics