目錄
概述
逐步示範
新增嵌入的資源
,且系統不會引發異常。
顯示資源
完整的程式碼
故障排除
首頁 後端開發 C#.Net教程 如何嵌入和使用C#來存取資源的程式碼詳解

如何嵌入和使用C#來存取資源的程式碼詳解

Mar 14, 2017 pm 01:54 PM

C#中如何使用嵌入的資源?

本逐步指南介紹如何使用 C# 來作為組件的一部分嵌入資源,然後在執行時存取資源。

概述

.NET Framework 可以封裝文件,為已編譯的組件的一部分。這些文件稱為嵌入的資源。這些資源是完全獨立的組件相關聯的.resources 和.resx 檔案。您可以在執行時間透過的System.Reflection命名空間組件類別存取這些資源。

嵌入的清單資源的主要優點是因為這些檔案是已編譯的組件的一部分,使用者不能意外刪除或誤放到您的應用程序,這在某些情況下可能會阻止程式的執行至關重要的文件。這種方法的一個限制是您無法保存任何更改到此文件的組件無需重新編譯該程式。正因為如此,只包含作為嵌入資源的應用程式的生存期內將不會更改的檔案。

逐步示範

若要將嵌入的資源加入您的專案中,必須先為您的專案的一部分新增這些檔案。將檔案新增至專案後,您可以存取和顯示透過System.Reflection命名空間中的資源。

新增嵌入的資源

要新增文字檔案和映像檔作為資源嵌入到您的項目,請按照下列步驟操作:

  1. #為此示範建立一個新的Windows 應用程式專案。此窗體用於顯示從執行的程序集在執行時存取的資源。

  2. 用滑鼠右鍵點選專案名稱,點選新增,然後點選新增項目

  3. 新專案

    對話方塊中,從選單上,選擇文字檔案,並命名為MyTextFile.txt 的檔案。在整合的開發環境 (IDE) 中開啟了該文件,添加一些文本,,然後關閉該文件。

  4. 重複步驟1 和2,將點陣圖圖像新增至專案中,但而不是作為新的專案類型中選擇
  5. 文字檔案

    ,選擇點陣圖檔案,然後將檔案名稱變更為MyImage.bmp。當在 IDE 中開啟新影像時,影像上, 繪製的內容,然後關閉該檔案。

  6. 用滑鼠右鍵點選檔案文字或點陣圖,然後選擇#屬性屬性對話方塊中,找到

    產生操作
  7. 屬性。預設情況下,此屬性設定為
  8. 內容

    。請按一下該屬性並將

    產生操作
  9. 屬性變更為
嵌入的資源



#對另一個檔案重複步驟 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中,結構化的錯誤處理用於捕捉的組件類別的實例存取資源時可能發生的任何錯誤。

顯示資源

此範例使用兩個按鈕以顯示嵌入的資源。當您按一下第一個按鈕時,基於從程式集中讀取資源的點陣圖影像創建,並顯示在窗體的圖片方塊控制項中。第二個按鈕的文字資源從讀取,並在文字方塊中顯示的文字。

若要顯示嵌入的資源,請執行下列步驟:

  1. 圖片方塊控制項加入到窗體中。

  2. 將一個新的按鈕控制項新增到窗體中,然後再將它的Text屬性變更為顯示影像

  3. 雙擊該按鈕以開啟其Click事件,在程式碼檢視器中,然後將下面的程式碼貼在這種情況:

  4.    try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }					
    登入後複製

    此程式碼會產生基於窗體的Load事件中讀取資源流的點陣圖中的一個新實例。

  5. 在表單中新增文字方塊控制項。

  6. 將另一個按鈕控制項加入到窗體上,然後再將它的Text屬性變更為取得文字

  7. 雙擊設計編輯器中開啟Click_Event的按鈕,該按鈕,然後將下面的程式碼貼在該事件中:

  8.    try
       {
          if(_textStreamReader.Peek() != -1)
          {
             textBox1.Text = _textStreamReader.ReadLine();
          }
       }
       catch
       {
          MessageBox.Show("Error writing text!");
       }					
    登入後複製

    此程式碼決定要讀取的字元是否仍然存在在流中。如果找到的字符,文字方塊中將讀取行。

  9. 按 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
使用 C# 的活動目錄 使用 C# 的活動目錄 Sep 03, 2024 pm 03:33 PM

使用 C# 的 Active Directory 指南。在這裡,我們討論 Active Directory 在 C# 中的介紹和工作原理以及語法和範例。

C# 中的隨機數產生器 C# 中的隨機數產生器 Sep 03, 2024 pm 03:34 PM

C# 隨機數產生器指南。在這裡,我們討論隨機數產生器的工作原理、偽隨機數和安全數的概念。

C# 資料網格視圖 C# 資料網格視圖 Sep 03, 2024 pm 03:32 PM

C# 資料網格視圖指南。在這裡,我們討論如何從 SQL 資料庫或 Excel 檔案載入和匯出資料網格視圖的範例。

C# 中的階乘 C# 中的階乘 Sep 03, 2024 pm 03:34 PM

C# 階乘指南。這裡我們討論 C# 中階乘的介紹以及不同的範例和程式碼實作。

c#多線程和異步的區別 c#多線程和異步的區別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

C# 中的模式 C# 中的模式 Sep 03, 2024 pm 03:33 PM

C# 模式指南。在這裡,我們討論 C# 中模式的介紹和前 3 種類型,以及其範例和程式碼實作。

C# 中的質數 C# 中的質數 Sep 03, 2024 pm 03:35 PM

C# 質數指南。這裡我們討論c#中素數的介紹和範例以及程式碼實作。

xml怎麼改格式 xml怎麼改格式 Apr 03, 2025 am 08:42 AM

可以採用多種方法修改 XML 格式:使用文本編輯器(如 Notepad )進行手工編輯;使用在線或桌面 XML 格式化工具(如 XMLbeautifier)進行自動格式化;使用 XML 轉換工具(如 XSLT)定義轉換規則;或者使用編程語言(如 Python)進行解析和操作。修改時需謹慎,並備份原始文件。

See all articles