zoukankan      html  css  js  c++  java
  • 如何在C#中使用内嵌资源文件(转载学习)

    转自:http://www.weiw.com/article/list.asp?id=79

    简介

    在好多的C#和 .Net的论坛中都会提到如何使用内嵌资源的话题,对大多一般的数项目来说,这也许更不就不是一个问题.但是,对于一些复杂的项目,这也许就成了问题.本文会把论坛中的内容汇总一下,比起查询论坛来,文章显得更容易查找和连接.

    第一件清楚的事情

    在VS.Net中,有多种使用资源文件的方法,最常用的方法是让Form来保存它所使用的资源文件,这个可以通过产生一个.resx文件来保存Form所用到的资源.本文不是讨论这个话题,因为通常开发人员不会关心这个简单的问题.

    第二种方法是使用资源文件,本文重点在这儿,包括如何在资源文件中添加文件,如何设置内嵌资源的”生成类型”.

    名称是如何规定的?

    当你使用内嵌资源文件时,通常要知道资源的名称.实际上它可以像一个文件名,但是通常会比文件名更复杂一点点.

    命名一般包括三个部分:<缺省的命名空间.><扩展命命名空间.><文件名>

    上面的第一部分和最后的第三部分都好理解. 缺省的命名空间就是项目的命名空间,文件名就是资源文件的名称.中间的这部分可能有些迷惑.

    简单的讲,扩展命名空间就是项目中的目录结构.如果你的资源文件就在项目的根目录下,扩展命名空间就不需要了,直接这样写就可以了. <缺省的命名空间.> <文件名>. 但是如果你在项目中产生目录结果的话,就要使用使用扩展命名空间了.比如你在项目的根目录下产生了一个Images目录,那么资源文件就要这样来表示: <缺省的命名空间.> Images.<文件名>. 如果你在Images路径下还有一个目录FormGraphics,那么资源文件就要这样表示: <缺省的命名空间.> Images.FormGraphics.<文件名>

    我想大家可能已经发现了上面的规律,在代码中你也可以这么写.当你在目录下使用VS自动产生了类,它也是安装这样的方式来命名类的名称. <缺省的命名空间.><扩展命命名空间.>. 虽然你可以手工的修改代码中的命名空间,但是有一点要记住,是不可以修改内嵌资源文件的命名空间结构的.

    如何得到资源

    普通方法

    普通的使用内嵌资源文件的方法是使用Assembly类的GetManifestResource方法.在第一个演示程序中,我们会使用下面这两个方法GetManifestResourceNames, GetManifestResourceStream

    这个演示程序会列举出一个装配件中的资源,可以把存选中的资源保到一个文件中.如果资源是一个图象,在程序中就可以显示出来.如果你还没有一个内嵌资源的装配件,第二个演示程序就是一个含有资源的装配件.

    这是在ListBox的 ListBox's SelectedIndexChanged 事件中,如果出来资源

    System.IO.Stream stream = loadedAssembly.GetManifestResourceStream(

    (string) resources.SelectedItem);

    System.Drawing.Image img = Image.FromStream(stream);

    上面的演示程序把一个装配件调入内存,在loadedAssembly变量中存储一个Assembly实例.也许在你的应用程序中,不需要调用其他装配件的资源,你只是想能从你自己的程序中得到资源.

    最简单的方法是使用Type类的Assembly属性来得到某一个类的一个实例,你可以用下面的方法来得到Type,如果是一个类,使用typeof(<class>),如果是一个类的实例变量,使用GetType().

    另一种实现方法

    GetManifestResourceStream有两种重载方法,一种是从一个资源文件中来得到一个Stream对象, 另一个中使用Type和string. 第二个会帮助我们得到可以使用的资源.它会根据清单资源的范围由指定类型的命名空间确定资源清单

    第二个演示程序是利用上面说得第二个方法来实现的.

    总结

    当你理解了上面的内容后,对于VS.net内嵌资源的使用就是易于反掌了.唯一要注意的地方就是找出VS.Net给你的资源文件的名字.

    =====

    转自:http://chinacgonlinedocuments.spaces.live.com/blog/cns!DAD7ADAED5CC1F1B!155.entry

    C#使用資源文件

    using System;
    using System.Drawing;
    using System.Resources;

    public class SampleClass
    {
         public static void Main()
         {
            try
            {
            //定義一個jpeg類型,讀入jpeg文件
             Image img = Image.FromFile("gsm.jpg");        
            創建資源文件
             ResXResourceWriter rsxw = new ResXResourceWriter("gsm.resx");
           //增加資源
             rsxw.AddResource("gsm.jpg",img);
             img = Image.FromFile("name.jpg");        
            
             rsxw.AddResource("name.jpg",img);
            創建各類資源
            Icon icon = new Icon("gsm.ico");
             逐個添加
             rsxw.AddResource("gsm.jpg",icon);
             rsxw.Close();
             }
             catch(Exception e)
             {
                Console.WriteLine(e.Message);
             }
         }
    }
    然後用resgen gsm.resx gsm.resources生成資源文件
    在csc編譯中制定資源文件gsm.resources
    然後是使用資源。正在學習。
    ====

    如何用Visual C#使用资源文件中资源(从资源文件中获取文字图片等)

    大体步骤如下(要将编译类型设置为内嵌,因为他默认的类型是CONTENT)  
    rational  
    1.用ResourceWriter产生一个资源文件.  
    ResourceWriter   rw   =   new   ResourceWriter("TheAres.resources");  

    Image   myImage   =   Image.FromFile("C:\\logo.gif");  

    rw.AddResource("MyLogo",myImage);  
    rw.AddResource("Title","TheAres");  
    rw.Close();  

    2.将资源文件添加到工程中.类型为"嵌入的资源".  

    3.用ResourceManager将资源读出.  
    Assembly   myAssem   =   Assembly.GetEntryAssembly();  

    ResourceManager   rm   =   new   ResourceManager("TheAresAdoNet.TheAres");  
    //TheAresAdoNet   是你程序的命名空间,TheAres是TheAres.resources  
    this.pictureBox1.Image   =   (Image)rm.GetObject("MyLogo");  
    this.Text   =   rm.GetString("Title");  

    复杂的资源文件,参考:  
    如何在C#中使用内嵌资源文件  
    http://www.csdn.net/develop/read_article.asp?id=15571  

    =====

    C#创建和使用资源文件

    转自:http://cdo.cnblogs.com/archive/2005/06/08/170451.html

    创建资源文件

         资源文件顾名思义就是存放资源的文件。资源文件在程序设计中有着自身独特的优势,他独立于源程序,这样资源文件就可以被多个程序使用。同时在程序设计的时候,有时出于安全或者其他方面因素的考虑,把重要东西存放在资源文件中,也可以达到保密、安全的效果。那么Visual C#所使用的资源文件中到底存放哪些东西呢?在用Visual C#创建资源文件大致可以存放三种类型的数据资源,分别是字节数组、各种对象和字符串。本文将结合一个程序例子来具体说明用Visual C#是如何创建资源文件的。

    一.用Visual C#在创建资源文件用到的一些概念和理论:
    在.Net FrameWork SDK中的一个名字叫System.Resources名称空间,在此名称空间中为应用程序提供了许多创建、存储和使用资源文件的类和接口。其中有一个类叫ResourceWriter,Visual C#就是通过调用这个类来实现创建、存储资源文件的。

    二.Visual C#如何创建资源文件:
    首先要继承一个ResourceWriter类,然后调用ResourceWriter类的一个方法Generate ( ),就可以产生一个资源文件了。具体语句如下:

    ResourceWriter rw = new ResourceWriter ( "My.resources" ) ;
    rw.Generate ( ) ;

    此时在磁盘的中就会产生一个名称为"My.resources"的资源文件,但此时的资源文件没有任何内容,下面我们就来看看如何往资源文件中添加资源。

    三.在资源文件中添加资源:
    在ResourceWriter类中提供了一个AddResource ( )方法,这个方法的作用就是往资源文件中添加资源的。在Visual C#中对不同的资源有着不同的加入方式。

    (1).加入字节数组,语法格式为:

    public void AddResource ( string , byte [ ] ) ;

    注释:其中string是在使用资源文件的时候,此字节数组在程序中的的唯一标识符

    (2).加入对象,语法格式为:

    public void AddResource ( string , object );

    注释:其中string是在使用资源文件的时候,此对象在程序中的唯一标识符

    在本文程序中,我们利用这种调用方式来加入图标和图象,具体如下:

    Icon ico = new Icon ( "Demo.ico" ) ;
    Image canceloff = Image.FromFile ("cancel-off.png") ;
    Image cancelon = Image.FromFile ( "cancel-on.png" ) ;
    Image cancelover = Image.FromFile ( "cancel-over.png" ) ;
    Image okdown = Image.FromFile ( "ok-down.png" ) ;
    Image okoff = Image.FromFile ( "ok-off.png" ) ;
    Image okon = Image.FromFile ( "ok-on.png" ) ;

    rw.AddResource ( "demo.ico" , ico ) ;//在资源文件中加入图标
    //以下是在资源文件中加入图象
    rw.AddResource ( "cancel-off.png" , canceloff ) ;
    rw.AddResource ( "cancel-on.png" , cancelon ) ;
    rw.AddResource ( "cancel-over.png" , cancelover ) ;
    rw.AddResource ( "ok-down.png" , okdown ) ;
    rw.AddResource ( "ok-off.png" , okoff ) ;
    rw.AddResource ( "ok-on.png" , okon ) ;

    (3).加入字符串,具体语法如下:

    public void AddResource ( string1 , string2) ;

    注释:其中string1是在使用资源文件的时候,此字符串在程序中的唯一标识符在本文的程序中,是如此使用的:

    rw.AddResource ( "MyStr" , "从资源文件中读取字符串!" );

    至此我们已经创建了一个资源文件,并且在资源文件中加入了若干个资源,当然在这之后,还应该注意,保存此资源文件,并关闭资源文件,具体如下:

    rw.Close ( ) ;

    四.创建资源文件的源程序代码:
    通过上面的论述,我们不难理解下面这些代码。下列程序代码的作用就是,创建一个名称为"My.resources"资源文件,并且在此资源文件中加入一个图标资源,若干个图象资源,和一个字符串资源。具体代码如下:

    CreatResources.cs:
    using System ;
    using System.Drawing ;
    using System.Resources ;

    class CreatResource
    {
    public static void Main ( )
    {
    ResourceWriter rw = new ResourceWriter ( "My.resources" ) ;
    Icon ico = new Icon ( "Demo.ico" ) ;

    Image canceloff = Image.FromFile ("cancel-off.png") ;
    Image cancelon = Image.FromFile ( "cancel-on.png" ) ;
    Image cancelover = Image.FromFile ( "cancel-over.png" ) ;
    Image okdown = Image.FromFile ( "ok-down.png" ) ;
    Image okoff = Image.FromFile ( "ok-off.png" ) ;
    Image okon = Image.FromFile ( "ok-on.png" ) ;

    rw.AddResource ( "demo.ico" , ico ) ;

    rw.AddResource ( "cancel-off.png" , canceloff ) ;
    rw.AddResource ( "cancel-on.png" , cancelon ) ;
    rw.AddResource ( "cancel-over.png" , cancelover ) ;
    rw.AddResource ( "ok-down.png" , okdown ) ;
    rw.AddResource ( "ok-off.png" , okoff ) ;
    rw.AddResource ( "ok-on.png" , okon ) ;

    rw.AddResource ( "MyStr" , "从资源文件中读取字符串!" ) ;
    rw.Generate ( ) ;
    rw.Close ( ) ;
    }
    }

    最好还要提醒一下,在成功编译成执行文件后,在执行此文件的时候,必须保证在此执行文件的相同目录,存在上面代码中提到名称的图标和图象,否则在创建资源文件的时候是会出错的。

    五.总结:
    可见用Visual C#创建资源文件并不是一个复杂的过程,在下一篇文章中,我们将介绍如何在Visual C#使用资源文件中资源。这才是Visual C#资源文件编程的重点和难点。当然文中所使用的资源文件就是以本文中创建的资源文件。

    使用资源文件

         在《Visual C#资源文件编程--创建资源文件》中已经介绍了如何用Visual C#创建资源文件。本文将接着上篇文章的话题来探讨资源文件另外一个问题,在Visual C#如何使用资源文件。在上一篇文章中,我们已经成功的创建了一个名称为"My.resources"的资源文件。这个资源文件中包含有一个图标资源,在文件中的名称为"demo.ico",若干个图片资源和一个字符串资源,在文件中的名称为"MyStr"。我们将以上一篇文章创建的此资源文件为对象,结合一个具体的程序例子来看一下用Visual C#如何使用资源文件。
    一.本文程序设计和运行的软件环境:
    (1).微软公司视窗2000服务器版

    (2)..Net FrameWork SDK Beta 2

    二.程序设计中的一些概念和理论:
    程序设计时涉及到的概念和理论主要是二种变量的相互转换。这就是二种变量就是所谓的实值类型变量(Value Type Variable)和参考类型变量(Reference Type Variable)。而二者之间的相互转换,在Visual C#中被称为装箱(Boxing)和出箱(Unboxing)。所谓装箱就是把实值类型变量转换成参考类型变量的过程,反之就是出箱。那么什么类型的变量是参考类型的变量,什么类型的变量又是实值类型变量呢?这二者之间有什么区别么?在Visual C#中的参考类型就是泛指这些类型,如:Object、Class、Interface、Delegate、String、Array等。这些类型定义的变量就是参考类型变量。而实值类型就是平常的平常使用的整型、布尔型、枚举型等,由这些类型定义的变量就是实值类型变量。他们之间的最大区别是参考类型变量是指向实体对象的指针,而实值类型变量就是实在的实体对象。由于装箱和出箱是一个概念性很强的操作过程,详细介绍需要很大的篇幅。而这超出了本文探讨的主要范畴。所以本文只介绍和程序相关的操作即出箱。具体的操作步骤,将在下一届结合程序来介绍。

    三.程序设计的思路已经重要步骤的解决方法:
    (1).如何在程序编译的时候中嵌入资源。资源文件和程序是二个独立的文件,要把资源文件嵌入到最后生成的程序中,需要在编译的时候加上"/resource"命令,这个命令可以简写为"/res"。在本文中程序的名称为"use.cs",资源文件的名称为"My.resources",则把资源嵌入程序的编译命令如下:

    Csc.exe /res:My.resources use.cs

    (2).如何在程序管理资源文件中的资源:

    在.Net FrameWork SDK这提供了一个关于资源文件创建和使用的名称空间--System.Resources。在这个名称空间中有一个Class为ResourceManager,这个Class的主要作用就是管理并使用资源文件。Visual C#是通过这个类来管理并使用嵌入程序中的资源文件中的资源。下列代码就是定义一个ResourceManager类来管理嵌入程序资源文件中的资源:

    ResourceManager rm = new ResourceManager ( "Images" , Assembly.GetExecutingAssembly ( ) ) ;

    (3).如何在程序中使用资源文件中的资源:

    在上一篇文章中,我们已经了解到在创建资源文件的时候,使用了AddResource ( )方法来加入资源,他的语法中的第一个参数是用户可以定义的字符串,这个字符串就是资源在资源文件的唯一标识,在程序设计中,就是通过这个唯一标识符来使用某个资源的。那么如何在程序中通过这个标识符来得到所需资源?这就要使用到ResourceManager类中的GetObject()和GetString()方法。这二个方法作用是获得指定的资源。下面是这二个方法的语法:

    object GetSting(String)
    object GetObject(String)

    其中的"String"就是资源在资源文件中的那个唯一标识符。细心的读者可能已经注意到,这二个方法的返回值都是一个Object类型的变量,也就是一个参考类型的变量,而在程序中的字符串或者图象等,是一个实值类型变量。这就需要进行转换,而这种转换就是上面所说的装箱和出箱。下列代码是从资源文件中提取字符串、图象和图标资源:

    提取字符串资源:

    String s = ( ( String ) rm.GetString ( "MyStr" ) ) ;

    提取图标资源:

    Icon icoDemo = ( ( Icon ) rm.GetObject ( "demo.ico" ) ) ;

    提取图象资源:

    Image a = ( ( Image ) ( rm.GetObject ( "ok-off.png" ) ) ) ;

    四.结合一个程序例子来看一下,资源文件的具体使用方法:
    下面的程序例子所使用的资源文件是上一篇文章中创建的资源文件"My.resources",程序中定义了三个Lable组件,其中的二个的作用是显示资源文件中图象资源,另外一个的作用是显示资源文件中字符串资源,程序的图标是取自资源文件中的图标资源。下面是程序的源代码:

    using System ;
    using System.Drawing ;
    using System.Collections ;
    using System.ComponentModel ;
    using System.Windows.Forms ;
    using System.Data ;
    using System.Resources ;
    using System.Reflection ;
    public class Form1 : Form
    {
    private Label lblOK ;
    private Label lblCancel ;
    private System.ComponentModel.Container components = null ;
    private Label lblResource ;
    public Form1 ( )
    {
    //初始化窗体中的组件
    InitializeComponent ( ) ;
    }
    //清除程序中使用过的资源
    protected override void Dispose ( bool disposing )
    {
    if ( disposing )
    {
    if ( components != null )
    {
    components.Dispose ( ) ;
    }
    }
    base.Dispose ( disposing ) ;
    }
    private void InitializeComponent ( )
    {
    ResourceManager rm = new ResourceManager ( "Images" , Assembly.GetExecutingAssembly ( ) ) ;
    this.lblOK = new Label ( ) ;
    this.lblCancel = new Label ( ) ;
    this.lblResource = new Label ( ) ;
    this.SuspendLayout ( ) ;

    this.lblOK.BackColor = System.Drawing.Color.White ;
    //使用资源文件中的图象资源
    this.lblOK.Image = ( ( Image ) ( rm.GetObject ( "ok-off.png" ) ) ) ;
    this.lblOK.Location = new System.Drawing.Point ( 24 , 40 ) ;
    this.lblOK.Name = "lblOK" ;
    this.lblOK.Size = new System.Drawing.Size ( 75 , 23 ) ;
    this.lblOK.TabIndex = 0 ;
    this.lblOK.Click += new System.EventHandler ( this.lblOK_Click ) ;
    this.lblOK.MouseEnter += new System.EventHandler ( this.lblOK_MouseEnter ) ;
    this.lblOK.MouseLeave += new System.EventHandler ( this.lblOK_MouseLeave ) ;
    //出箱
    //使用资源文件中的图象资源
    this.lblCancel.Image = ( ( Image ) ( rm.GetObject ( "cancel-off.png" ) ) ) ;
    this.lblCancel.Location = new System.Drawing.Point ( 152 , 40 ) ;
    this.lblCancel.Name = "lblCancel" ;
    this.lblCancel.Size = new System.Drawing.Size ( 75 , 23 ) ;
    this.lblCancel.TabIndex = 1 ;
    this.lblCancel.Click += new System.EventHandler ( this.lblCancel_Click ) ;
    this.lblCancel.MouseEnter += new System.EventHandler ( this.lblCancel_MouseEnter ) ;
    this.lblCancel.MouseLeave += new System.EventHandler ( this.lblCancel_MouseLeave ) ;

    this.lblResource.Location = new System.Drawing.Point ( 88 , 8 ) ;
    this.lblResource.Name = "lblResource" ;
    this.lblResource.TabIndex = 2 ;
    //出箱
    //使用资源文件中的字符串资源
    this.lblResource.Text = ( ( String ) rm.GetString ( "MyStr" ) ) ;

    this.AutoScaleBaseSize = new System.Drawing.Size ( 5 , 13 ) ;
    this.ClientSize = new System.Drawing.Size ( 240 , 101 ) ;
    this.Controls.Add ( lblResource ) ;
    this.Controls.Add ( lblCancel ) ;
    this.Controls.Add ( lblOK ) ;
    //出箱
    //使用资源文件中的图标资源
    Icon icoDemo = ( ( Icon ) rm.GetObject ( "demo.ico" ) ) ;
    this.Icon = icoDemo ;
    this.Name = "Form1" ;
    this.Text = "Visual C#中使用资源文件!" ;
    this.ResumeLayout ( false ) ;

    }
    static void Main ( )
    {
    Application.Run ( new Form1 ( ) ) ;
    }
    private void lblOK_MouseEnter ( object sender , System.EventArgs e )
    {
    ResourceManager rm = new ResourceManager ( "Images" , Assembly.GetExecutingAssembly ( ) ) ;
    this.lblOK.Image = ( ( Image ) ( rm.GetObject ( "ok-on.png" ) ) ) ;
    }

    private void lblOK_MouseLeave ( object sender , System.EventArgs e )
    {
    ResourceManager rm = new ResourceManager ( "Images" , Assembly.GetExecutingAssembly ( ) ) ;
    this.lblOK.Image = ( ( Image ) ( rm.GetObject ( "ok-off.png" ) ) ) ;
    }

    private void lblOK_Click ( object sender, System.EventArgs e )
    {
    ResourceManager rm = new ResourceManager ( "Images" , Assembly.GetExecutingAssembly ( ) ) ;
    this.lblOK.Image = ( ( Image ) ( rm.GetObject ( "ok-down.png" ) ) ) ;
    }

    private void lblCancel_MouseEnter ( object sender , System.EventArgs e )
    {
    ResourceManager rm = new ResourceManager ( "Images" , Assembly.GetExecutingAssembly ( ) ) ;
    this.lblCancel.Image = ( ( Image ) ( rm.GetObject ( "cancel-onr.png" ) ) ) ;
    }

    private void lblCancel_MouseLeave ( object sender , System.EventArgs e )
    {
    ResourceManager rm = new ResourceManager ( "Images" , Assembly.GetExecutingAssembly ( ) ) ;
    this.lblCancel.Image = ( ( Image ) ( rm.GetObject ( "cancel-off.png" ) ) ) ;
    }

    private void lblCancel_Click(object sender, System.EventArgs e)
    {
    ResourceManager rm = new ResourceManager ( "Images" , Assembly.GetExecutingAssembly ( ) ) ;
    this.lblCancel.Image = ( ( Image ) ( rm.GetObject ( "cancel-over.png" ) ) ) ;
    }
    }

    五.总结:
    至此我们已经完成了在Visual C#资源文件方面编程的全部内容,其中的主要内容就是创建资源文件和使用资源文件二大方面,我想通过这二篇文章的介绍,你对资源文件应该有了一个比较全面的认识了吧!


  • 相关阅读:
    数组 滑动窗口
    爬虫案例 下载某文库付费文档 全格式
    双指针 三数之和
    双指针 四数之和
    双指针法 环形链表 II
    判断是否手机端
    C# 模拟点击
    chrome 扩展开发注意事项
    破解拖动验 证码
    //刷新任务栏图标 终止别的进程序有些程序有托盘会残留
  • 原文地址:https://www.cnblogs.com/bnuvincent/p/1543041.html
Copyright © 2011-2022 走看看