C#中如何使用嵌入的資源?
本逐步指南介紹如何使用 C# 來作為組件的一部分嵌入資源,然後在執行時存取資源。
.NET Framework 可以封裝文件,為已編譯的組件的一部分。這些文件稱為嵌入的資源。這些資源是完全獨立的組件相關聯的.resources 和.resx 檔案。您可以在執行時間透過的System.Reflection命名空間的組件類別存取這些資源。
嵌入的清單資源的主要優點是因為這些檔案是已編譯的組件的一部分,使用者不能意外刪除或誤放到您的應用程序,這在某些情況下可能會阻止程式的執行至關重要的文件。這種方法的一個限制是您無法保存任何更改到此文件的組件無需重新編譯該程式。正因為如此,只包含作為嵌入資源的應用程式的生存期內將不會更改的檔案。
若要將嵌入的資源加入您的專案中,必須先為您的專案的一部分新增這些檔案。將檔案新增至專案後,您可以存取和顯示透過System.Reflection命名空間中的資源。
要新增文字檔案和映像檔作為資源嵌入到您的項目,請按照下列步驟操作:
#為此示範建立一個新的Windows 應用程式專案。此窗體用於顯示從執行的程序集在執行時存取的資源。
用滑鼠右鍵點選專案名稱,點選新增,然後點選新增項目
對話方塊中,從選單上,選擇文字檔案,並命名為MyTextFile.txt 的檔案。在整合的開發環境 (IDE) 中開啟了該文件,添加一些文本,,然後關閉該文件。
,選擇點陣圖檔案,然後將檔案名稱變更為MyImage.bmp。當在 IDE 中開啟新影像時,影像上, 繪製的內容,然後關閉該檔案。
用滑鼠右鍵點選檔案文字或點陣圖,然後選擇#屬性在屬性對話方塊中,找到
產生操作。請按一下該屬性並將
產生操作
#對另一個檔案重複步驟 4 和 5。 下次產生專案時,編譯器會將這些檔案加入您的組件。它包含在專案中時,編譯器會將專案的根命名空間新增到的資源的名稱。例如,如果您的專案的根命名空間是 MyNamespace,則資源命名為 MyNamespace.MyTextFile.txt 和 MyNamespace.MyImage.bmp。
請注意
: 資源檔案的名稱是區分大小寫。在存取資源時,您必須使用的確切拼字和大小寫的檔案名稱。如果您不使用的確切拼字和大小寫的檔案名,該方法呼叫來存取Manif
estResourceStream
傳回
注意: 如果您想要驗證這些資源名稱,您可以使用 Microsoft 中間語言拆裝器 (ILDASM) 查看清單數據,其中列出了所包含的資源。
###存取資源######若要存取已在您的組件的清單中嵌入的資源,導引###System.IO###和### System.Reflection###命名空間中,如下所述:###using System.IO; using System.Reflection;
System.IO命名空間提供了在流的定義和System.Reflection命名空間中定義的組件提供的類別的方法,以存取程式集中嵌入的資源。
聲明在以下常規宣告區域中的時,在載入窗體時讀取從程式集中的資源:
Assembly _assembly; Stream _imageStream; StreamReader _textStreamReader;
注意: 要存取在程式碼編輯器中的窗體的Load事件,請雙擊該窗體在設計編輯器。
若要讀取從正在執行的目前程式碼的組件的資源,您必須取得該組件的一個實例。若要執行此操作,請使用該程序集,GetExecutingAssembly方法,如下所示:
_assembly = Assembly.GetExecutingAssembly();
從資源到流中讀取訊息,對GetManifestResourceStream的方法調用執行。傳遞給此方法的參數是要存取的資源的名稱。在執行該窗體的Load事件,然後讀取兩個資源到其對應的流。
_imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp"); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));
在窗體的Load事件中的程式碼如下:
try { _assembly = Assembly.GetExecutingAssembly(); _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp"); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt")); } catch { MessageBox.Show("Error accessing resources!"); }
Try-catch語句中,稱為在.NET中,結構化的錯誤處理用於捕捉的組件類別的實例存取資源時可能發生的任何錯誤。
此範例使用兩個按鈕以顯示嵌入的資源。當您按一下第一個按鈕時,基於從程式集中讀取資源的點陣圖影像創建,並顯示在窗體的圖片方塊控制項中。第二個按鈕的文字資源從讀取,並在文字方塊中顯示的文字。
若要顯示嵌入的資源,請執行下列步驟:
將圖片方塊控制項加入到窗體中。
將一個新的按鈕控制項新增到窗體中,然後再將它的Text屬性變更為顯示影像
雙擊該按鈕以開啟其Click事件,在程式碼檢視器中,然後將下面的程式碼貼在這種情況:
try { pictureBox1.Image = new Bitmap(_imageStream); } catch { MessageBox.Show("Error creating image!"); }
此程式碼會產生基於窗體的Load事件中讀取資源流的點陣圖中的一個新實例。
在表單中新增文字方塊控制項。
將另一個按鈕控制項加入到窗體上,然後再將它的Text屬性變更為取得文字
雙擊設計編輯器中開啟Click_Event的按鈕,該按鈕,然後將下面的程式碼貼在該事件中:
try { if(_textStreamReader.Peek() != -1) { textBox1.Text = _textStreamReader.ReadLine(); } } catch { MessageBox.Show("Error writing text!"); }
此程式碼決定要讀取的字元是否仍然存在在流中。如果找到的字符,文字方塊中將讀取行。
按 F5 鍵來執行該應用程式。
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO; using System.Reflection; namespace MyNamespace { /// <summary> /// Summary description for Form1. /// </summary> public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Required for Windows Form Designer support. // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call. // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // pictureBox1 // this.pictureBox1.Location = new System.Drawing.Point(4, 8); this.pictureBox1.Name = "pictureBox1"; this.pictureBox1.Size = new System.Drawing.Size(284, 192); this.pictureBox1.TabIndex = 0; this.pictureBox1.TabStop = false; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(92, 236); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(192, 20); this.textBox1.TabIndex = 1; this.textBox1.Text = "textBox1"; // // button1 // this.button1.Location = new System.Drawing.Point(8, 208); this.button1.Name = "button1"; this.button1.TabIndex = 2; this.button1.Text = "Show Image"; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.Location = new System.Drawing.Point(8, 236); this.button2.Name = "button2"; this.button2.TabIndex = 3; this.button2.Text = "Get Text"; this.button2.Click += new System.EventHandler(this.button2_Click); // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 266); this.Controls.AddRange(new System.Windows.Forms.Control[]{ this.button2, this.button1, this.textBox1, this.pictureBox1}); this.Name = "Form1"; this.Text = "Form1"; this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); } #endregion Assembly _assembly; Stream _imageStream; StreamReader _textStreamReader; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } private void Form1_Load(object sender, System.EventArgs e) { try { _assembly = Assembly.GetExecutingAssembly(); _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp"); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt")); } catch { MessageBox.Show("Error accessing resources!"); } } private void button1_Click(object sender, System.EventArgs e) { try { pictureBox1.Image = new Bitmap(_imageStream); } catch { MessageBox.Show("Error creating image!"); } } private void button2_Click(object sender, System.EventArgs e) { try { if(_textStreamReader.Peek() != -1) { textBox1.Text = _textStreamReader.ReadLine(); } } catch { MessageBox.Show("Error writing text!"); } } } }
注意在 Visual Studio 2005年中或在 Visual Studio 2008 中,則應變更程式碼。在建立 Windows 窗體專案時,Visual C# 一個窗體會為專案中新增預設情況下。此窗體名為 Form1。表示窗體的兩個檔案稱為 Form1.cs 和 Form1.designer.cs。 Form1.cs 中編寫您的程式碼。 Designer.cs 檔案是 Windows 窗體設計器所寫的程式碼所實現的所有操作,您透過新增控制項來執行。有關 Windows 窗體設計器在 Visual C# 2005年或 Visual Studio 2008 中的詳細信息,請訪問下面的 Microsoft Web 網站:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx
#由於資源名稱是區分大小寫,請驗證您正在使用相應的拼字和大小寫的資源的存取。您可以使用 ILDASM 讀取清單的數據,來驗證資源的確切拼字。
以上是如何嵌入和使用C#來存取資源的程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!