国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

在.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開發。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉祥县| 襄汾县| 南京市| 福清市| 黄平县| 西畴县| 嘉义市| 鄯善县| 抚顺县| 简阳市| 禹城市| 师宗县| 桦南县| 吉水县| 乌兰县| 达拉特旗| 永福县| 缙云县| 上饶县| 安庆市| 盘山县| 永靖县| 赤壁市| 广丰县| 南部县| 莱阳市| 和平县| 乌兰县| 涞源县| 封丘县| 汉川市| 澄迈县| 邵东县| 玛纳斯县| 中牟县| 渝北区| 丰台区| 宜昌市| 龙胜| 甘肃省| 平阳县|