为.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文件:
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資源:
public void AddResource(string name,//鍵名string value//值 ); |
在這里,AddResource方法的第一個參數指定鍵名稱,第二個參數指定值。多次調用該方法就可以完成字符串表的創建。另外,添加圖象資源可以通過實例化類Image來實現(這時,請添加System.Drawing名稱空間)。
下面的代碼段生成包含字符串表和圖象的資源文件userinfo.resources。
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 從指定根名稱導出的。
public ResourceManager(string baseName,Assembly assembly ) |
其中,參數baseName表示資源的根名稱。根名稱由應用程序名稱空間和資源文件名(不帶擴展名)組成。這樣,該例中資源的根名稱應該是:UserinfoResource.Userinfo,通過調用GetManifestResourceNames()方法也可編程獲取該名稱。
另一個參數assembly表示的是當前的主程序集,本例中的主程序集其實也是正在執行的程序集。獲取正在執行程序集的一個簡單方法是調用Assembly.GetExecutingAssembly()方法。
在獲取ResourceManager實例后,通過指定鍵名,就可以獲得對應的資源。
下表是程序中使用的部分控件:
| 類別 | TextBox | TextBox | TextBox | TextBox | PictureBox |
| 名稱 | username | sex | birthday | salary | photo |
這些控件均可直接從工具箱拖放到設計器中。
完整的源代碼為:
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");
} |
運行這段代碼,就可以取出資源文件內容。
總結
以上是生活随笔為你收集整理的为.Net程序集添加资源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析.Net共享程序集编程
- 下一篇: 如何在.NET中创建服务型组件