在.Net中嵌入資源文件到程序集中
2024-07-10 13:01:05
供稿:網友
一、導言... 3
二、軟件環境... 3
三、資源文件... 3
四、創建資源文件... 3
五、使用資源文件... 6
5.1 在命令行編譯中使用資源文件... 6
5.2 在visual studio.net中使用資源文件... 8
六、結束語... 9
一、導言
microsoft的.net從2002年1月15日第一版發布到今天,已經得到了廣泛的使用;從剛推出時國內相關書籍種類寥寥,到今天.net的相關書籍的大大豐富,已有越來越多的人——初學者或者有經驗的程序員,在學習、應用.net。本文面向對.net有些了解的者,以c#為例,介紹如何在.net編程環境中,把資源文件(如包含圖片、字符串等的資源文件)嵌入到程序集中。這里的所說的程序集可以是exe文件,也可是供其他程序調用的dll文件。
本文不涉及國際化、本地化、打包和部署資源方面的內容,有興趣的讀者可以查閱.net framework sdk文檔。
二、軟件環境
運行本文中的程序需要如下軟件環境:windows 2000/xp, .net framework sdk。本文中的代碼在如下環境中運行通過:windows xp professional, .net framework v1.1 , visual studio.net 2003。
三、資源文件
幾乎每一個生產性應用程序都需要使用資源。資源是在邏輯上由應用程序部署的任何非可執行數據。資源可以在應用程序中作為錯誤信息顯示,或者作為用戶界面的一部分顯示。資源可以包含多種形式的數據,包括字符串、圖像和持久的對象。通過在資源文件中存儲數據,無需重新編譯整個應用程序即可更改數據。
在.net中,有文本文件.resx 文件和 .resources 文件三種資源文件。如果資源將只包含字符串數據,則文本文件是最簡單的選擇。如果資源將包含對象或字符串與對象的組合,則必須創建 .resx 文件或 .resources 文件。注意,只有 .resources 文件才應能嵌入在公共語言運行庫程序集和附屬程序集中。
四、創建資源文件
創建資源文件,有編寫代碼以及利用名為reseditor的軟件這兩種途徑。以下分述之。
4.1 編寫代碼創建資源文件
.net framework 類庫中提供了resourcewriter 類來創建.resources 文件。resourcewriter 類包含在system.resources命名空間中。resourcewriter 類以系統默認的格式將資源寫入輸出文件或輸出流。
在resourcewriter 類中使用 addresource 方法將資源指定為名稱和值對。資源名在用于查找時是區分大小寫的,但是,為更易于支持創作工具和幫助消除錯誤,resourcewriter 將不允許使用僅大小寫不同 .resources 文件名。
若要創建一個資源文件,請用唯一的文件名創建 resourcewriter,至少調用 addresource 一次,再調用 generate 將該資源文件寫入磁盤,然后調用 close 關閉該文件。
下面的示例將若干個字符串寫入到 myresources.resources 文件中。
//例1
//本示例代碼來自 .net framework sdk文檔
//createrestest_1_1.cs
using system;
using system.resources;
public class writeresources {
public static void main(string[] args) {
// creates a resource writer.
iresourcewriter writer = new resourcewriter("myresources.resources");
// adds resources to the resource writer.
writer.addresource("string 1", "first string");
writer.addresource("string 2", "second string");
writer.addresource("string 3", "third string");
// writes the resources to the file or stream, and closes it.
writer.close();
}
}
編譯代碼:csc createrestest_1_1.cs , 編譯成功后,則在工作目錄里生成名為createrestest_1_1.exe的可執行文件;運行該文件,在工作目錄中生成名為string.resources的資源文件。
以上給出了字符串寫入資源文件的例子,下面的示例嘗試將若干張圖片嵌入到資源文件myresources.resources中。
//例2
//createrestest_1_2.cs
using system;
using system.drawing;
using system.resources;
public class creatpicresource
{
public static void main ()
{
// creates a resource writer.
resourcewriter rw = new resourcewriter ( "picture.resources" );
//從指定的文件創建image對象.
//_bird.png、 _butterfly.png文件在當前工作目錄
image _bird_pic = image.fromfile ( "_bird.png" );
image _butterfly_pic = image.fromfile ("_butterfly.png" );
//把image對象添加到資源文件中
//resourcewritername.addresource(string name, object value);
//其中name為資源名,value為資源值
rw.addresource ( "bird" , _bird_pic );
rw.addresource ( "butterfly" , _butterfly_pic );
// writes the resources to the file or stream, and closes it.
rw.generate ();
rw.close ();
}
}
確保_bird.png和_butterfly.png文件在當前工作目錄。編譯代碼:csc createrestest_1_2.cs , 如編譯成功,生成createrestest_1_2.exe;運行該文件,則生成資源文件picture.resources。
4.2 利用資源編輯器 (reseditor)創建資源文件
.net framework 中包含一個稱為 reseditor 的示例應用程序,它可幫助您創建和編輯資源文件。reseditor可以創建二進制資源文件 (.resources) 以及 xml 資源文件 (.resx)。
生成 reseditor
reseditor 以源代碼的形式隨 .net framework sdk 一起提供。必須先使用提供的批處理文件生成 reseditor,然后才能使用它。找到 /sdk/v1.1/samples/tutorials/resourcesandlocalization/reseditor文件夾,運行批處理文件build.bat,編譯成功后,生成reseditor.exe應用程序。在筆者所用的環境中,路徑如下:
/program files/microsoft visual studio .net 2003/sdk/v1.1/samples/tutorials/resourcesandlocalization/reseditor 。
生成 reseditor 后,您可以使用它創建、編輯資源文件。
使用 reseditor 創建資源文件
啟動reseditor應用程序。
從“添加”下拉菜單中選擇要添加的資源類型。
在“添加”文本框中鍵入資源的名稱,然后單擊“添加”按鈕,將資源項添加到文件中。
在主窗格中,單擊資源名稱旁邊的單元格以指定一個值。
對于“字符串”資源,在該框中鍵入相應的字符串。
對于“圖像”和其他類型的資源,請瀏覽到相應的文件。
對于要添加到文件中的每個資源,重復步驟 3、4、5。
在“文件”菜單中,單擊“另存為”以保存文件。您可以將文件保存為 .resources 文件,也可以保存為 .resx 文件。
編輯現有資源文件
可以使用 reseditor 編輯現有資源文件(.resources 文件和 .resx 文件)。使用方法如下:
啟動reseditor應用程序。
在“文件”菜單上單擊“打開”。
在“打開資源文件”對話框中瀏覽到相應的資源文件。
資源文件打開,并且它包含的資源顯示在主窗格中。
如果要更改任何資源的值,請單擊資源名稱旁邊的單元格并指定正確的值。
對于“字符串”資源,在該框中鍵入相應的字符串。
對于“圖像”和其他類型的資源,請瀏覽到相應的文件。
如果要重命名資源,請執行以下操作:
通過單擊要重命名的資源,突出顯示它。
在“重命名”文本框中鍵入新名稱。
單擊“重命名”按鈕,應用新名稱。
如果要刪除資源,請通過單擊該資源將其突出顯示,然后從“資源”菜單中選擇“刪除”。
編輯完資源文件后,選擇“文件”,然后選擇“另存為”以保存文件。
五、使用資源文件
創建了資源文件后,很容易將它們添加到您的應用程序中。二進制資源文件 (.resources) 或 xml 資源文件 (.resx) 可直接添加到您的項目中。當編譯項目時,同時也會編譯資源文件。您可以通過使用 resourcemanager 類檢索嵌入的資源(即已經編譯到程序集中的資源)。
如果您希望經常更新程序中的資源而無需重新編譯整個解決方案,可創建一個資源程序集。
5.1 在命令行編譯中使用資源文件
這里使用例2代碼生成的資源文件picture.resources作為示例。示例代碼createrestest_2_1.cs如下:
//例3
//createrestest_2_1.cs
using system;
using system.drawing;
using system.windows.forms;
using system.resources;
using system.reflection;
public class testresform : system.windows.forms.form
{
private picturebox picbox1;
private picturebox picbox2;
public testresform()
{
picbox1 = new picturebox();
picbox1.location = new point(0,0);
picbox1.width = rescontainer.instance.butterflyimage.width;
picbox1.height = rescontainer.instance.butterflyimage.height;
picbox1.image = rescontainer.instance.butterflyimage;
picbox2 = new picturebox();
picbox2.location = new point(0,100);
picbox2.width = rescontainer.instance.birdimage.width;
picbox2.height = rescontainer.instance.birdimage.height;
picbox2.image = rescontainer.instance.birdimage;
controls.add(picbox1);
controls.add(picbox2);
this.size = new size(200,200);
}
public static void main()
{
application.run(new testresform());
}
}
public class rescontainer
{
// data members
private image _birdimage = null;
private image _butterflyimage = null;
private static rescontainer _instance = new rescontainer();
// constructor
private rescontainer()
{
try
{
resourcemanager rm = new resourcemanager( "picture",
assembly.getexecutingassembly() ) ;
_butterflyimage = (image)( rm.getobject ( "butterfly" ) );
_birdimage = (image)( rm.getobject ( "bird" ) );
}
catch(exception ex)
{
ex.tostring();
}
}
// properties
public static rescontainer instance
{
get{
return _instance;
}
}
public image butterflyimage
{
get{
return _butterflyimage;
}
}
public image birdimage
{
get{
return _birdimage;
}
}
}
在控制臺下,切換工作目錄到當前代碼、資源文件所在目錄,運行csharp編譯器csc(具體使用請參見.net framework sdk)。確保資源文件存在且正確,輸入:csc /t:winexe /resource:picture.resources userestest_2_1.cs,編譯成功后得到userestest_2_1.cs.exe。
5.2 在visual studio.net中使用資源文件
向您的項目添加資源文件:從“項目”菜單中,選擇“添加現有項”。“添加現有項”對話框打開。瀏覽到要添加到項目中的資源文件。它可能是 .resources 文件,也可能是 .resx 文件。選擇適當的文件。
在“生成”菜單中,選擇“生成解決方案”將資源文件嵌入到您的已編譯項目中。注意,如果對已添加到項目中的資源文件作出更改,需要在“生成”菜單中,選擇“重新生成解決方案”,使更改生效。
至于代碼,和userestest_2_1.cs略有不同。假設所在項目的命名空間為project1,則需要把rescontainer構造方法中的:
resourcemanager rm
= new resourcemanager( "picture", assembly.getexecutingassembly() ) ;
改為:
resourcemanager rm = new resourcemanager(" project1.picture",
assembly.getexecutingassembly() ) ;
如果不加上命名空間,則生成解決方案時并不會出現任何錯誤提示,而在編譯、執行會出現錯誤。奇怪的時執行完resourcemanager rm
= new resourcemanager( "picture", assembly.getexecutingassembly() ) ; 這一行時rm并不為null,也不拋出異常,就這樣悄悄的進行下去了。執行到下一句:
_butterflyimage = (image)( rm.getobject ( "butterfly" ) );
異常拋出,異常信息如下:“system.resources.missingmanifestresourceexception: could not find any resources appropriate for the specified culture (or the neutral culture) in the given assembly. make sure /"picture.resources/" was correctly embedded or linked into assembly /"project1/"”。
究其原因,應該是ide搗的鬼,把后添加如的資源文件也納入其命名空間中。試把項目的默認命名空間刪除(右鍵單擊項目,屬性,常規),則資源文件前就不需要加上命名空間了。
六、結束語
資源文件的創建和使用就介紹到這里,其中文本格式和.resx格式的資源文件沒有涉及。資源文件的一大用途——國際化,也不在本文范圍內。在有些程序的編寫中,把資源文件嵌入程序集中,至少可以避免程序集文件,對以文件形式存在的資源的依賴——如果form.exe程序需要的圖片文件背刪除了或不在正確的路徑下,怎么辦? 當然,在visual studio.net的視圖設計器中,可以添加圖片等資源,但學會自己動手完成對資源的創建,管理和使用,也不至于被visual studio.net這樣優秀的ide慣壞了(其實很難不被慣壞)。
,歡迎訪問網頁設計愛好者web開發。