Gewusst wie: Einbetten und Zugriff auf Ressourcen mithilfe von Visual C#

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 319292 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser schrittweise aufgebaute Artikel beschreibt, wie Sie mit Visual C# Ressourcen als Teil der Assembly einbetten und dann zur Laufzeit auf die Ressourcen zugreifen.

(Übersicht)

Das.NET Framework kann Dateien als Teil einer kompilierten Assembly kapseln. Diese Dateien werden als eingebettete Ressourcen bezeichnet. Diese Ressourcen sind völlig unabhängig von der Resources- und RESX-Dateien, die der Assembly zugeordnet sind. Auf diese Ressourcen können Sie zur Laufzeit mithilfe des System.Reflection -Namespace der Assembly -Klasse zugreifen.

Einbetten von Ressourcen in das Manifest ein wichtiger Vorteil ist, da die Dateien Teil Ihrer kompilierten Assembly, der Benutzer kann nicht versehentlich gelöscht oder Dateien, die für die Anwendung von entscheidender Bedeutung sind, die in einigen Fällen möglicherweise die Ausführung des Programms vergessen. Ein Nachteil dieses Ansatzes ist, dass Sie keine Änderungen an dieser Datei auf die Assembly speichern können, ohne die Anwendung neu zu kompilieren. Aus diesem Grund nur enthalten Sie Dateien, die während der Lebensdauer der Anwendung als eingebettete Ressource nicht geändert werden.

Schrittweise Demonstration

Um eingebettete Ressourcen dem Projekt hinzuzufügen, müssen Sie zuerst die Dateien als Teil des Projekts hinzufügen. Nachdem Sie die Dateien dem Projekt hinzugefügt haben, können Sie Zugriff auf und zeigen die Ressourcen über den System.Reflection -Namespace.

Hinzufügen von eingebetteten Ressourcen

Wenn Sie eine Textdatei und eine Image-Datei dem Projekt als eingebettete Ressourcen hinzugefügt haben, gehen Sie folgendermaßen vor:
  1. Erstellen Sie ein neues Windows-Anwendungsprojekt für diese Demo. Dieses Formular wird verwendet, um die Ressourcen anzuzeigen, die über die ausführende Assembly zur Laufzeit zugegriffen werden.
  2. Mit der rechten Maustaste des Projektnamen, klicken Sie auf Hinzufügen, und klicken Sie dann auf Neues Element hinzufügen.
  3. Wählen Sie im Menü Datei im Dialogfeld " Neues Element " und nennen Sie die Datei MyTextFile.txt. Wenn die Datei in der integrierten Entwicklungsumgebung (IDE) geöffnet wird, fügen Sie Text hinzu und schließen Sie die Datei.
  4. Wiederholen Sie die Schritte 1 und 2, um ein Bitmap-Bild zu Ihrem Projekt, aber anstelle von Textdatei als neue Elementtyp hinzuzufügen, wählen Sie Bitmap-Dateiund ändern Sie dann den Dateinamen zu MyImage.bmp. Wenn das neue Bild in der IDE geöffnet ist, schließen Sie die Datei zeichnen Sie etwas im Bild zu
  5. Mit der rechten Maustaste wählen Sie die Textdatei oder die Bitmap aus und dann wählen Sie Eigenschaften.
  6. Suchen Sie im Dialogfeld Eigenschaften die Build Action -Eigenschaft. Standardmäßig ist diese Eigenschaft auf Inhaltfestgelegt. Klicken Sie auf die Eigenschaft, und ändern Sie die Build Action -Eigenschaft in Eingebettete Ressource.
  7. Wiederholen Sie die Schritte 4 und 5 für die andere Datei.
Das nächste Mal, wenn, das Sie das Projekt erstellen, fügt der Compiler diese Dateien der Assembly. Der Compiler fügt den Stammnamespace des Projekts auf den Namen der Ressource, wenn es im Projekt enthalten ist. Z. B.: Wenn der Stammnamespace des Projekts MyNamespace ist, werden die Ressourcen, MyNamespace.MyTextFile.txt und MyNamespace.MyImage.bmp benannt.

Hinweis: die Ressourcendateinamen sind Groß-und Kleinschreibung berücksichtigt. Wenn Sie auf die Ressourcen zugreifen, müssen Sie die genaue Schreibweise und Groß-/Kleinschreibung des Dateinamens verwenden. Verwenden Sie nicht die genaue Schreibweise und Fall den Dateinamen, den Methodenaufruf auf dem ManifestResourceStream gibt nichts, und das System wird keine Ausnahme auslösen.

Hinweis: Wenn Sie die Ressourcennamen überprüfen möchten, können die Microsoft Intermediate Language Disassembler (ILDASM) anzeigen die Manifestdaten enthalten Ressourcen aufgeführt sind.

Zugriff auf Ressourcen

Um auf die Ressourcen zugreifen, die Sie im Manifest der Assembly eingebettet haben, importieren Sie System.IO und die System.Reflection -Namespaces wie folgt:
   using System.IO;
   using System.Reflection;
				
Der System.IO -Namespace stellt die Definition eines Streams und der System.Reflection -Namespace definiert die Assembly Klasse mit Methoden, um auf die Ressourcen zugreifen, die in die Assembly eingebettet sind.

Wenn Sie in den allgemeinen Deklarationsbereich des folgende deklarieren, werden die Ressourcen aus der Assembly beim Laden des Formulars gelesen:
   Assembly _assembly;
   Stream _imageStream;
   StreamReader _textStreamReader;
				
Hinweis: um das Load -Ereignis für das Formular im Code-Editor zuzugreifen, doppelklicken Sie auf das Formular in der Entwurfsansicht.

Um die Ressource aus der Assembly zu lesen, die der aktuellen Code ausgeführt wird, müssen Sie eine Instanz der Assembly abrufen. Zu diesem Zweck verwenden Sie die GetExecutingAssembly -Methode der Assembly, wie folgt:
   _assembly = Assembly.GetExecutingAssembly();
				
Lesen die Informationen aus der Ressource in einen Stream mit einem Methodenaufruf von GetManifestResourceStreamerfolgt. Der Parameter, der an diese Methode übergebene ist der Name der Ressource, auf die zugegriffen werden soll. Zwei Ressourcen werden dann in ihre entsprechenden Streams gelesen, wenn das Load -Ereignis des Formulars ausgeführt wird.
   _imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");
   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));
				
Der Code im Load -Ereignis für das Formular ähnelt dem folgenden:
   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }
				
Die Try-Catch -Anweisung, bekannt als strukturierte Fehlerbehandlung in .NET wird verwendet, um Fehler abzufangen, die auftreten können, während die Instanz der Assembly -Klasse auf die Ressourcen zugreift.

Ressourcen anzeigen

Dieses Beispiel verwendet zwei Schaltflächen in eingebetteten Ressourcen angezeigt. Wenn Sie die erste Schaltfläche klicken, wird ein Bitmap-Bild, die auf die Ressource, die von der Assembly gelesen wird erstellt und in das PictureBox -Steuerelement des Formulars angezeigt. Die zweite Schaltfläche von einer Textressource liest und zeigt den Text in einem Textfeld.

Um die eingebetteten Ressourcen anzuzeigen, gehen Sie folgendermaßen vor:
  1. Fügen Sie ein PictureBox -Steuerelement zum Formular hinzu.
  2. Fügen Sie ein neues Schaltflächensteuerelement auf das Formular, und ändern Sie dann die Text -Eigenschaft auf Bild anzeigen.
  3. Doppelklicken Sie auf die Schaltfläche, um das Click -Ereignis im Codeviewer zu öffnen, und fügen Sie den folgenden Code in diesem Ereignis:
       try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }
    					
    Dieser Code generiert eine neue Instanz einer Bitmap, die auf den Ressourcenstream basiert, die in das Load -Ereignis des Formulars gelesen wurde.

  4. Fügen Sie ein TextBox -Steuerelement auf das Formular.
  5. Fügen Sie ein weiteres Button -Steuerelement auf das Formular, und ändern Sie dann die Text -Eigenschaft auf Text erhalten.
  6. Doppelklicken Sie auf die Schaltfläche in der Entwurfsansicht, öffnen Sie die Click_Event für die Schaltfläche, und fügen Sie den folgenden Code im Ereignis ein:
       try
       {
          if(_textStreamReader.Peek() != -1)
          {
             textBox1.Text = _textStreamReader.ReadLine();
          }
       }
       catch
       {
          MessageBox.Show("Error writing text!");
       }
    					
    Dieser Code legt fest, ob im Stream noch zu lesenden Zeichen vorhanden sind. Wenn Zeichen gefunden werden, wird eine Zeile in das Textfeld gelesen.

  7. Drücken Sie F5, um die Anwendung auszuführen.

Vollständigen 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!");
            }		
         }
      }
   }
				
Hinweis Der Code sollte in Visual Studio 2005 oder Visual Studio 2008 geändert werden. Bei der Erstellung von Windows Forms-Projekt fügt Visual C# ein Formular zum Projekt standardmäßig. Dieses Formular ist mit der Bezeichnung Form1. Die beiden Dateien, die das Formular darstellen, werden Form1.cs und Form1.designer.cs benannt. Schreiben Sie den Code in "Form1.cs". Die Datei Designer.cs ist, schreibt der Windows Forms-Designer dem Code, der alle Aktionen implementiert, dass Sie durch Hinzufügen von Steuerelementen ausgeführt.Weitere Informationen zu Windows Forms-Designer in Visual C# 2005 oder Visual Studio 2008 finden Sie auf der folgenden Microsoft-Website:
http://msdn2.Microsoft.com/en-us/library/ms173077.aspx

Problembehandlung:

Da Ressourcennamen Groß-/Kleinschreibung beachtet werden, sollten überprüfen Sie, dass Sie verwenden die richtige Schreibweise und Groß-/Kleinschreibung der Ressourcen, auf die zugegriffen werden. ILDASM können zum Lesen der Daten Manifest, um die genaue Schreibweise der Ressourcen zu überprüfen.

Informationsquellen

Weitere Informationen finden Sie auf den folgenden Websites von Microsoft Developer Network (MSDN):
System.Reflection-Namespace
http://msdn2.Microsoft.com/en-us/library/System.Reflection (VS

Assembly-Klasse
http://msdn2.Microsoft.com/en-us/library/System.Reflection.Assembly (VS

Assembly.GetManifestResourceStream-Methode
http://msdn2.Microsoft.com/en-us/library/System.Reflection.Assembly.GetManifestResourceStream (VS

Eigenschaften

Artikel-ID: 319292 - Geändert am: Montag, 28. Juli 2014 - Version: 5.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
Keywords: 
kbsweptvs2008 kbhowtomaster kbmt KB319292 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 319292
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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