搜尋
首頁後端開發C#.Net教程如何嵌入和使用C#來存取資源的程式碼詳解

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
c#.net適合您嗎?評估其適用性c#.net適合您嗎?評估其適用性Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

.NET中的C#代碼:探索編程過程.NET中的C#代碼:探索編程過程Apr 12, 2025 am 12:02 AM

C#在.NET中的編程過程包括以下步驟:1)編寫C#代碼,2)編譯為中間語言(IL),3)由.NET運行時(CLR)執行。 C#在.NET中的優勢在於其現代化語法、強大的類型系統和與.NET框架的緊密集成,適用於從桌面應用到Web服務的各種開發場景。

C#.NET:探索核心概念和編程基礎知識C#.NET:探索核心概念和編程基礎知識Apr 10, 2025 am 09:32 AM

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

測試C#.NET應用程序:單元,集成和端到端測試測試C#.NET應用程序:單元,集成和端到端測試Apr 09, 2025 am 12:04 AM

C#.NET應用的測試策略包括單元測試、集成測試和端到端測試。 1.單元測試確保代碼的最小單元獨立工作,使用MSTest、NUnit或xUnit框架。 2.集成測試驗證多個單元組合的功能,常用模擬數據和外部服務。 3.端到端測試模擬用戶完整操作流程,通常使用Selenium進行自動化測試。

高級C#.NET教程:ACE您的下一次高級開發人員面試高級C#.NET教程:ACE您的下一次高級開發人員面試Apr 08, 2025 am 12:06 AM

C#高級開發者面試需要掌握異步編程、LINQ、.NET框架內部工作原理等核心知識。 1.異步編程通過async和await簡化操作,提升應用響應性。 2.LINQ以SQL風格操作數據,需注意性能。 3..NET框架的CLR管理內存,垃圾回收需謹慎使用。

C#.NET面試問題和答案:提高您的專業知識C#.NET面試問題和答案:提高您的專業知識Apr 07, 2025 am 12:01 AM

C#.NET面試問題和答案包括基礎知識、核心概念和高級用法。 1)基礎知識:C#是微軟開發的面向對象語言,主要用於.NET框架。 2)核心概念:委託和事件允許動態綁定方法,LINQ提供強大查詢功能。 3)高級用法:異步編程提高響應性,表達式樹用於動態代碼構建。

使用C#.NET建築微服務:建築師實用指南使用C#.NET建築微服務:建築師實用指南Apr 06, 2025 am 12:08 AM

C#.NET是構建微服務的熱門選擇,因為其生態系統強大且支持豐富。 1)使用ASP.NETCore創建RESTfulAPI,處理訂單創建和查詢。 2)利用gRPC實現微服務間的高效通信,定義和實現訂單服務。 3)通過Docker容器化微服務,簡化部署和管理。

C#.NET安全性最佳實踐:防止常見漏洞C#.NET安全性最佳實踐:防止常見漏洞Apr 05, 2025 am 12:01 AM

C#和.NET的安全最佳實踐包括輸入驗證、輸出編碼、異常處理、以及身份驗證和授權。 1)使用正則表達式或內置方法驗證輸入,防止惡意數據進入系統。 2)輸出編碼防止XSS攻擊,使用HttpUtility.HtmlEncode方法。 3)異常處理避免信息洩露,記錄錯誤但不返回詳細信息給用戶。 4)使用ASP.NETIdentity和Claims-based授權保護應用免受未授權訪問。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1

記事本++7.3.1

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

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用