天天看點

如何在C#中使用内嵌資源檔案

簡介

在好多的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 然後是使用資源。正在學習。 ==== 轉自: http://www.faq-it.org/archives/csharp/de9b744e1f9894ca333c5dc41e3666b8.php

如何用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#資源檔案方面程式設計的全部内容,其中的主要内容就是建立資源檔案和使用資源檔案二大方面,我想通過這二篇文章的介紹,你對資源檔案應該有了一個比較全面的認識了吧!