Einbetten von und Zugriff auf Ressourcen mithilfe von Visual Basic .NET oder Visual Basic 2005

Eine Microsoft C# .NET Version dieses Artikels finden Sie unter
319292 .
Eine Microsoft Visual Basic 6.0-Version dieses Artikels finden Sie unter
205332 .

IN DIESER AUFGABE

Zusammenfassung

Dieser Artikel beschreibt, wie Sie mit Microsoft Visual Basic .NET oder Microsoft Visual Basic 2005 Ressourcen als Teil der Assembly einbetten und Zugriff auf Ressourcen zur Laufzeit.

Übersicht

Das.NET Framework kann Dateien als Teil einer kompilierten Assembly kapseln. Diese Dateien werden als eingebettete Ressourcen bezeichnet. Diese Ressourcen sind vollständig unabhängig vom 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.

Ein großer Vorteil des Einbettens von Ressourcen ins Manifest ist, dass Dateien die für Ihre Anwendung unverzichtbar sind, Teil der kompilierten Assembly werden. Dadurch können sie vom Benutzer nicht aus Versehen gelöscht oder verschoben werden. Dies kann in einigen Fällen möglicherweise die Ausführung des Programms verhindern. 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 sollten Sie nur Dateien als eingebettete Ressource einbinden, die sich nicht während der Lebensdauer der Anwendung ändern.

Schrittweise demonstration

Um eingebettete Ressourcen zu Ihrem Projekt hinzufügen, müssen Sie zuerst die Dateien als Teil Ihres Projekts hinzufügen. Nachdem Sie die Dateien dem Projekt hinzugefügt haben, können Sie über den System.Reflection -Namespace auf die Ressourcen zugreifen bzw. sie anzeigen.

Eingebettete Ressourcen hinzufügen

Um eine Textdatei und eine Image-Datei dem Projekt als eingebettete Ressourcen hinzuzufügen, 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 die ausführende Assembly zur Laufzeit zugreifen.
  2. Maustaste auf Ihr Projekt klicken Sie auf Hinzufügen, und klicken Sie auf Neues Element hinzufügen.
  3. Im Dialogfeld " Neues Element " Menü Datei und benennen Sie die Datei MyTextFile.txt. Beim Öffnen der Datei in der integrierten Entwicklungsumgbung (IDE) fügen Sie Text hinzu, und schließen Sie die Datei.
  4. Wiederholen Sie die Schritte 1 und 2, um eine Bitmap zum Projekt hinzuzufügen, aber wählen Sie statt Textdatei diesmal Bitmap-Datei als Elementtyp aus und ändern Sie den Dateinamen in MyImage.bmp. Wenn das neue Bild in der IDE geöffnet ist, zeichnen Sie etwas und schließen Sie die Datei.
  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 Eigenschaft Buildvorgang . 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 Sie das Projekt erstellen, fügt der Compiler diese Dateien der Assembly hinzu. Der Compiler fügt den Stammnamespace des Projekts auf den Namen der Ressource, wenn es im Projekt enthalten ist. Beispielsweise ist der Stammnamespace des Projekts MyNamespace Ressourcen MyNamespace.MyTextFile.txt und MyNamespace.MyImage.bmp heißen.

Hinweis Ressourcendateien werden beachtet. Zugriff auf die Ressourcen verwenden Sie die Schreibweise und Groß-/Kleinschreibung des Dateinamens. Wenn Sie nicht die genaue Schreibweise verwenden und Fall des Dateinamens der Methodenaufruf ManifestResourceStream Zugriff auf nichts, und das System löst keine Ausnahme.

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

Zugriff auf Ressourcen

Um auf die Ressourcen zugreifen, die im Manifest der Assembly eingebettet sind, importieren Sie Namespaces System.Reflection und System.IO wie folgt:
   Imports System.IO   Imports System.Reflection

System.IO -Namespace enthält die Definition eines Streams und System.Reflection -Namespace definiert die Assembly Klasse mit Methoden, um auf die Ressourcen zugreifen, die in die Assembly eingebettet sind.

Wenn Sie das Folgende im allgemeinen Deklarationsbereich deklarieren, werden die Ressourcen aus der Assembly beim Laden des Formulars gelesen.
   Dim _imageStream As Stream   Dim _textStreamReader As StreamReader
Dim _assembly As [Assembly]

Hinweis Um das Load -Ereignis für das Formular im Code-Editor zuzugreifen, doppelklicken Sie auf das Formular in der Entwurfsansicht.

Lesen die Ressource aus der Assembly, die den aktuellen Code ausgeführt wird, benötigen Sie eine Instanz der Assembly. Dazu verwenden Sie die GetExecutingAssembly -Methode der Assembly wie folgt:
   _assembly = [Assembly].GetExecutingAssembly()
Das Lesen der Informationen aus der Ressource in einen Stream erfolgt mit dem Aufruf der Methode GetManifestResourceStream. An diese Methode übergebene Parameter ist der Name der Ressource zugegriffen werden. Die Ressourcen werden dann in ihre entsprechenden Streams gelesen, wie das Load -Ereignis des Formulars ausgeführt wird.
   _imageStream =  _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp")   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"))

Im Load -Ereignis des Formulars Code folgendermaßen aussehen:
   Try      _assembly = [Assembly].GetExecutingAssembly()
_imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp")
_textStreamReader = New StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"))
Catch ex As Exception
MessageBox.Show("Resource wasn't found!", "Error")
End Try

Die Try-Catch -Anweisung als strukturierte Fehlerbehandlung in .NET wird verwendet, um Fehler abzufangen, die aufgetreten sind, während die Instanz der Assembly -Klasse Ressourcen zugreift.

Ressourcen anzeigen

Dieses Beispiel verwendet zwei Schaltflächen eingebetteten Ressourcen anzeigen. Beim Klicken auf die erste Schaltfläche eine Bitmap, die auf die Ressource, die aus der Assembly gelesen werden erstellt und in das PictureBox -Steuerelement des Formulars angezeigt. Die zweite Schaltfläche liest aus einem Text und Text in einem Textfeld angezeigt.

Gehen Sie folgendermaßen vor, um die eingebetteten Ressourcen anzuzeigen:
  1. Ein PictureBox -Steuerelement zum Formular hinzufügen.
  2. Das Formular ein neues Schaltflächensteuerelement hinzu, und ändern Sie die Texteigenschaft in Bild anzeigen.
  3. Doppelklicken Sie auf die Schaltfläche Click -Ereignis im Code Viewer zu öffnen, und fügen Sie folgenden Code in diesem Ereignis:
       Try      PictureBox1.Image = New Bitmap(_imageStream)
    Catch ex As Exception
    MessageBox.Show("Image Couldn't be created !")
    End Try

    Dieser Code generiert eine neue Instanz einer Bitmap, die auf den Ressourcenstream, die im 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 die Text -Eigenschaft Text Abzurufen.
  6. Doppelklicken Sie auf die Schaltfläche in der Entwurfsansicht geöffnet Click_Event für die Schaltfläche, und fügen Sie folgenden Code im Ereignis:
       Try      If _textStreamReader.Peek() <> -1 Then
    TextBox1.Text = _textStreamReader.ReadLine()
    End If
    Catch ex As Exception
    MessageBox.Show("Error reading stream!")
    End Try

    Dieser Code legt fest, ob im Stream noch zu lesende Zeichen vorhanden sind. Wenn Zeichen gefunden werden, wird eine Zeile im Textfeld gelesen.
  7. Drücken Sie F5, um die Anwendung auszuführen.

Vollständigen code

   Imports System.IO   Imports System.Reflection

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Public Sub New()
MyBase.New()

'This call is required by the Windows Form Designer.
InitializeComponent()

'Add any initialization after the InitializeComponent() call.
End Sub

'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Required by the Windows Form Designer.
Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer.
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
Friend WithEvents Button2 As System.Windows.Forms.Button
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button()
Me.PictureBox1 = New System.Windows.Forms.PictureBox()
Me.Button2 = New System.Windows.Forms.Button()
Me.TextBox1 = New System.Windows.Forms.TextBox()
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(16, 196)
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 0
Me.Button1.Text = "Show Image"
'
'PictureBox1
'
Me.PictureBox1.Location = New System.Drawing.Point(8, 8)
Me.PictureBox1.Name = "PictureBox1"
Me.PictureBox1.Size = New System.Drawing.Size(280, 184)
Me.PictureBox1.TabIndex = 1
Me.PictureBox1.TabStop = False
'
'Button2
'
Me.Button2.Location = New System.Drawing.Point(16, 232)
Me.Button2.Name = "Button2"
Me.Button2.TabIndex = 2
Me.Button2.Text = "Get Text"
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(100, 232)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(176, 20)
Me.TextBox1.TabIndex = 3
Me.TextBox1.Text = "TextBox1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.TextBox1, Me.Button2, Me.PictureBox1, Me.Button1})
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub

#End Region

Dim _imageStream As Stream
Dim _textStreamReader As StreamReader
Dim _assembly As [Assembly]

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
_assembly = [Assembly].GetExecutingAssembly()
_imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp")
_textStreamReader = New StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"))
Catch ex As Exception
MessageBox.Show("Resource wasn't found!", "Error")
End Try
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
PictureBox1.Image = New Bitmap(_imageStream)
Catch ex As Exception
MessageBox.Show("Image Couldn't be created !")
End Try
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Try
If _textStreamReader.Peek() <> -1 Then
TextBox1.Text = _textStreamReader.ReadLine()
End If
Catch ex As Exception
MessageBox.Show("Error reading stream!")
End Try
End Sub
End Class

Hinweis Der Code sollte in Visual Basic 2005 geändert werden. Erstellen Sie ein neues Formular mit dem Namen Form1 in Visual Basic 2005, eine Datei Form1.vb Code erstellt und eine Form1.Designer.vb-Datei erstellt enthält, das automatisch generierte Teil. Windows Forms-Designer verwendet partielle Schlüsselwort, um die Implementierung von Form1 in zwei separate Dateien aufzuteilen. Dadurch wird verhindert, dass vom Designer ausgegebenen Code mit dem Code kombiniert.



Weitere Informationen über die neuen Funktionen von Visual Basic 2005 Sprache finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:


Weitere Informationen zu partiellen Klassen und Windows Forms-Designer finden Sie auf der folgenden MSDN-Website:

Problembehandlung:

Da bei Ressourcennamen die Groß-/Kleinschreibung beachtet wird, überprüfen Sie, ob die Schreibweise der Ressourcen korrekt ist. ILDASM können Manifestdaten überprüfen Sie die Schreibweise der Ressourcen gelesen werden.

Referenzen

Weitere Informationen finden Sie auf folgenden Websites von Microsoft Developer Network (MSDN):
Eigenschaften

Artikelnummer: 319291 – Letzte Überarbeitung: 16.01.2017 – Revision: 1

Feedback