วิธีการฝัง และการเข้าถึงทรัพยากร โดยใช้ Visual c#

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 319292 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความที่มีการทีละขั้นตอนนี้อธิบายวิธีการใช้ Visual c# ฝังทรัพยากรเป็นส่วนหนึ่งของแอสเซมบลี และเข้าถึงทรัพยากรในขณะดำเนินการแล้ว

ภาพรวม

.NET Framework สามารถ encapsulate แฟ้มเป็นส่วนหนึ่งของแอสเซมบลีที่คอมไพล์แล้ว แฟ้มเหล่านี้ถูกเรียกว่าทรัพยากรที่ฝังตัว ทรัพยากรเหล่านี้ได้อย่างสมบูรณ์แยกต่างหากจาก.resources และ.resx แฟ้มต่าง ๆ ที่เกี่ยวข้องกับแอสเซมบลี คุณสามารถเข้าถึงทรัพยากรเหล่านี้ในขณะที่ดำเนินการผ่านทางการแอสเซมบลีคลาสของSystem.Reflectionnamespace

ประโยชน์ที่สำคัญของการฝังทรัพยากรให้กับรายการไม่ว่า เนื่องจากแฟ้มเป็นส่วนหนึ่งของแอสเซมบลีที่คอมไพล์แล้วของคุณ ผู้ใช้ไม่โดยไม่ตั้งใจลบ หรือ misplace แฟ้มที่มีความสำคัญกับโปรแกรมประยุกต์ของคุณ ซึ่งในบางกรณีอาจป้องกันไม่ให้ดำเนินการของโปรแกรมของคุณ ข้อจำกัดหนึ่งของวิธีการนี้ไม่ว่า คุณไม่สามารถบันทึกการเปลี่ยนแปลงใด ๆ ไปยังแฟ้มนี้ไปยังแอสเซมบลีไม่ recompiling โปรแกรม เนื่องจากความตัว ซึ่งรวมถึงแฟ้มที่จะไม่ได้มีการเปลี่ยนแปลงในระหว่างอายุการใช้งานของโปรแกรมประยุกต์ของคุณเป็นทรัพยากรฝังตัว เท่านั้น

เดโม step-by-Step

เมื่อต้องการเพิ่มทรัพยากรที่ฝังตัวในโครงการของคุณ คุณก่อนต้องเพิ่มแฟ้มที่เป็นส่วนหนึ่งของโครงการของคุณ หลังจากที่คุณได้เพิ่มแฟ้มโครงการของคุณ คุณสามารถเข้าถึง และแสดงทรัพยากรผ่านการSystem.Reflectionnamespace

เพิ่มทรัพยากรที่ฝังตัว

เมื่อต้องการเพิ่มแฟ้มข้อความและแฟ้มรูปโครงการของคุณเป็นทรัพยากรที่ฝังตัว ดำเนินการดังต่อไปนี้:
  1. สร้างโครงการแอพลิเคชันของ Windows ใหม่สำหรับการสาธิตนี้ ใช้แบบฟอร์มนี้เพื่อแสดงทรัพยากรที่มีการเข้าถึงได้จากแอสเซมบลีที่กำลังระหว่างเวลารัน
  2. คลิกขวาที่ชื่อโครงการของคุณ คลิกaddแล้ว คลิกเพิ่มรายการใหม่.
  3. ในการสินค้าใหม่กล่องโต้ตอบ เลือกแฟ้มข้อความจากเมนู และชื่อแฟ้ม MyTextFile.txt เมื่อเปิดแฟ้มในสภาพแวดล้อมการพัฒนารวม (IDE), เพิ่มข้อความ และปิดแฟ้มแล้ว
  4. ทำซ้ำขั้นตอนที่ 1 และ 2 การเพิ่มรูปบิตแมปโครงการของคุณ แต่แทนที่ การเลือกแฟ้มข้อความตามประเภทสินค้าใหม่ เลือกแฟ้มบิตแมปแล้ว เปลี่ยนชื่อแฟ้มต้องการMyImage.bmp. เมื่อมีเปิดรูปภาพใหม่ใน IDE วาดบางสิ่งบางอย่างบนรูป และปิดแฟ้มแล้ว
  5. คลิกขวาที่แฟ้มข้อความหรือบิตแมป และจากนั้น เลือกคุณสมบัติ.
  6. ในการคุณสมบัติกล่องโต้ตอบกล่อง ค้นหานี้สร้างการดำเนินการคุณสมบัติ โดยค่าเริ่มต้น คุณสมบัตินี้ถูกกำหนดเป็นเนื้อหา. คลิกคุณสมบัติ และการเปลี่ยนแปลงนั้นสร้างการดำเนินการคุณสมบัติการทรัพยากรที่ฝังตัว.
  7. ทำซ้ำขั้นตอนที่ 4 และ 5 สำหรับแฟ้มอื่น ๆ
ในครั้งถัดไปที่คุณสร้างโครงการ คอมไพเลอร์เพิ่มแฟ้มเหล่านี้ไปยังแอสเซมบลีของคุณ คอมไพเลอร์เพิ่ม namespace รากของโครงการที่ชื่อของทรัพยากรเมื่อมีการรวมไว้ในโครงการ ตัวอย่างเช่น ถ้า namespace รากของโครงการ MyNamespace ทรัพยากรมีชื่อ MyNamespace.MyTextFile.txt และ MyNamespace.MyImage.bmp

หมายเหตุ:: ชื่อแฟ้มของทรัพยากรอยู่ case-sensitive เมื่อคุณเข้าถึงทรัพยากร คุณต้องใช้การสะกดที่แน่นอนและกรณีที่ชื่อแฟ้ม ถ้าคุณไม่ได้ใช้การสะกดที่แน่นอนและกรณีที่ชื่อแฟ้ม วิธีการเรียกเพื่อเข้าถึงManifestResourceStreamส่งกลับค่าไม่มีสิ่งใดและระบบการเพิ่มข้อยกเว้นที่ไม่

หมายเหตุ:: ถ้าคุณต้องการตรวจสอบชื่อทรัพยากร คุณสามารถใช้ใน Microsoft ระดับปานกลางภาษา Disassembler (ILDASM) เพื่อดูรายการข้อมูล ซึ่งแสดงรายการทรัพยากรที่รวมอยู่

การเข้าถึงทรัพยากร

การเข้าถึงทรัพยากรที่คุณมีการฝังตัวในรายการของแอสเซมบลีของคุณ นำเข้าSystem.IOและSystem.Reflectionnamespaces ดัง:
   using System.IO;
   using System.Reflection;
				
กระบวนการSystem.IOnamespace แสดงคำนิยามของกระแสข้อมูลและSystem.Reflectionกำหนด namespaceแอสเซมบลีคลาสที่ให้วิธีการเข้าถึงทรัพยากรที่ฝังอยู่ในแอสเซมบลีของคุณ

เมื่อคุณประกาศต่อไปนี้ในพื้นที่การรายงานทั่วไป ทรัพยากรจากแอสเซมบลีถูกอ่านเมื่อฟอร์มถูกโหลด:
   Assembly _assembly;
   Stream _imageStream;
   StreamReader _textStreamReader;
				
หมายเหตุ:: การเข้าถึงการโหลดเหตุการณ์สำหรับฟอร์มในตัวรหัสแก้ไข ดับเบิลคลิกที่ฟอร์มในตัวแก้ไขการออกแบบ

เมื่อต้องการอ่านทรัพยากรจากแอสเซมบลีที่กำลังดำเนินการรหัสปัจจุบัน คุณต้องขอรับอินสแตนซ์ของแอสเซมบลีนั้น เมื่อต้องการทำเช่นนี้ ใช้GetExecutingAssemblyเมธอดของแอสเซมบลี ดัง:
   _assembly = Assembly.GetExecutingAssembly();
				
อ่านข้อมูลจากทรัพยากรการกระแสข้อมูลจะดำเนินการกับการเรียกวิธีGetManifestResourceStream. พารามิเตอร์ที่ส่งผ่านไปยังวิธีนี้มีชื่อของทรัพยากรที่จะสามารถเข้าถึง ทรัพยากรที่สองเป็นอ่านแล้วเมื่อต้องการของกระแสข้อมูลที่สอดคล้องกันเป็นการโหลดเหตุการณ์ของฟอร์มจะดำเนินการ
   _imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");
   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));
				
รหัสในนั้นการโหลดเหตุการณ์สำหรับฟอร์มมีลักษณะดังต่อไปนี้:
   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }
				
กระบวนการลอง-Catchงบดุล เรียกว่าจัดการข้อผิดพลาดอย่างเป็นระบบใน.NET ใช้ในการตรวจจับข้อผิดพลาดใด ๆ ที่อาจเกิดขึ้นได้ในขณะที่อินสแตนซ์ของการแอสเซมบลีคลาเข้าถึงทรัพยากร

ทรัพยากรการแสดงผล

ตัวอย่างนี้ใช้ปุ่มสองปุ่มแสดงทรัพยากรที่ฝังตัว เมื่อคุณคลิกปุ่มแรก เป็นรูปบิตแมปที่ใช้ทรัพยากรที่มีอ่านจากแอสเซมบลีที่ สร้างขึ้น และแสดงขึ้นในการPictureBoxการควบคุมของฟอร์ม ปุ่มที่สองอ่านจากทรัพยากรข้อความ และแสดงข้อความในกล่องข้อความ

เมื่อต้องการแสดงทรัพยากรที่ฝังตัว ดำเนินการดังต่อไปนี้:
  1. เพิ่มคำPictureBoxควบคุมไปยังแบบฟอร์ม
  2. เพิ่มใหม่ปุ่มcontrol to the form, and then change itsข้อความคุณสมบัติการShow Image.
  3. Double-click the button to open itsคลิกevent in the code viewer, and then paste the following code in this event:
       try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }
    					
    This code generates a new instance of a bitmap that is based on the resource stream that was read in theการโหลดevent of the form.

  4. เพิ่มคำกล่องข้อความควบคุมไปยังแบบฟอร์ม
  5. เพิ่มอีกปุ่มcontrol to the form, and then change itsข้อความคุณสมบัติการGet Text.
  6. Double-click the button in the Design Editor to open theClick_Eventfor the button, and then paste the following code in the event:
       try
       {
          if(_textStreamReader.Peek() != -1)
          {
             textBox1.Text = _textStreamReader.ReadLine();
          }
       }
       catch
       {
          MessageBox.Show("Error writing text!");
       }
    					
    This code determines whether characters to be read still exist in the stream. If characters are found, a line is read to the text box.

  7. กด F5 เพื่อเรียกใช้โปรแกรมประยุกต์

Full Code

   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 Forms, Visual c# เพิ่มฟอร์มหนึ่งโครงการ โดยค่าเริ่มต้น แบบฟอร์มนี้เป็นชื่อ Form1 มีการตั้งชื่อแฟ้มที่สองที่แสดงแบบฟอร์ม Form1.cs และ Form1.designer.cs คุณสามารถเขียนรหัสของคุณใน Form1.cs แฟ้ม Designer.cs คือ ซึ่งผู้ออกแบบฟอร์ม Windows เขียนรหัสที่ใช้การดำเนินการทั้งหมดที่ คุณดำเนินการ โดยการเพิ่มตัวควบคุม For more information about the Windows Forms Designer in Visual C# 2005 or in Visual Studio 2008, visit the following Microsoft Web site:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx

การแก้ไขปัญหา

Because resource names are case-sensitive, verify that you are using the correct spelling and case of the resources that are accessed. You can use ILDASM to read the Manifest data to verify the exact spelling of the resources.

ข้อมูลอ้างอิง

For more information, see the following Microsoft Developer Network (MSDN) Web sites:
System.Reflection Namespace
.aspx http://msdn2.microsoft.com/en-us/library/system.reflection (vs.71)

Assembly Class
.aspx http://msdn2.microsoft.com/en-us/library/system.reflection.assembly (vs.71)

Assembly.GetManifestResourceStream Method
.aspx http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.getmanifestresourcestream (vs.71)

คุณสมบัติ

หมายเลขบทความ (Article ID): 319292 - รีวิวครั้งสุดท้าย: 13 มกราคม 2554 - Revision: 4.0
ใช้กับ
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
Keywords: 
kbsweptvs2008 kbhowtomaster kbmt KB319292 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:319292

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com