Dateien als eingebettete Ressourcen nutzen

Veröffentlicht: 12. Mai 2005
Von Mathias Schiffer

Mathias Schiffer zeigt in diesem MSDN Quickie, wie Sie auszulesende Dateien direkt in Ihre EXE- und DLL-Projekte einkompilieren und dort verwenden können.

Dateien, die Sie nur zu anwendungsinternen Zwecken auslesen wollen, haben in einem aufgeräumten Anwendungsverzeichnis kaum etwas verloren. Denken Sie etwa an Schema-Dateien für XML-Dokumente, die Ihre Anwendung vor der Verwendung der Daten gegen eine Datenbank zu validieren hat, oder an eine Lizenzvertragsanzeige im „Hilfe“-Fenster Ihrer Anwendung. Wenn nicht gute Gründe für ausgelagerte Dateien sprechen, stellen Ressourcen eine durchaus interessante Alternative dar.

Visual Studio .NET und das .NET Framework machen es Ihnen einfach, solche Dateien in Ihr Produkt selber als so genannte „Ressourcen“ mit einzukompilieren und darauf zur Programmlaufzeit zuzugreifen.

Ressourcen einbetten

Dafür laden Sie einfach über „Datei / Vorhandenes Element hinzufügen“ die betroffene Datei in Visual Studio .NET mit in Ihr Projekt. Die Datei erscheint damit im Projektmappen-Explorer.

Markieren Sie dort die Datei, können Sie im Eigenschaften-Fenster die Eigenschaft „Buildaktion“ verändern: Wählen Sie einfach den Wert „Eingebettete Ressource“ aus. Schon fertig. Beim nächsten Kompilieren wird die Datei in Ihrem Kompilat mit eingebunden sein.

Eingebettete Ressourcen abrufen

Das Einbetten einer Datei als Ressource kann natürlich nur den ersten Schritt darstellen. Interessanter ist, wie der so hinterlegte Dateiinhalt nun abgerufen werden kann, statt ihn als Datei von einem Laufwerk laden zu müssen.

Hierbei hilft die Funktion GetManifestResourceStream im Namespace System.Reflection.Assembly, die auf Basis einer ermittelten Assembly Daten aus einer darin eingebetteten Ressource als I/O-Stream zur Verfügung stellt. Die eigene Assembly lässt sich dabei einfach durch den parameterlosen Aufruf der Funktion GetExecutingAssembly referenzieren. Der zur Ansprache der Ressource benötigte Pfad entspricht dem Assembly-Namen mit folgendem Punkt und dem Namen (samt Endung) der als Ressource eingebetteten Datei.

Im folgenden Kurzbeispiel wurde eine Schemadatei zur Validierung von XML-Daten als eingebettete Ressource definiert, ihr Dateiname lautet „Schema.xsd“. Ein neues DataSet-Objekt liest daraufhin das Schema mithilfe der DataSet-Methode ReadXmlSchema über ein – wie beschrieben erzeugtes – Stream-Objekt ein. Entspricht eine per ReadXml einzulesende Datei nicht dem vorgegebenen Schema, so wird eine entsprechende Fehlerbehandlung ausgelöst.

' Vollen Ressourcenpfad zusammenstellen
    Dim strFilename As String = "Schema.xsd"  ' Beispiel: XML-Schema
    Dim strSchemaPath As String = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name & "." & strFilename
  
    ' Die Ressource per Stream auslesen
    Dim objIOStream As System.IO.Stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(strSchemaPath)
  
    ' Beispielanwendung: Einlesen eines XML Schemas
    Dim dsDataSet As New DataSet
    dsDataSet.ReadXmlSchema(objIOStream)
  
    ' XML-Daten einlesen
    Try
  
      dsDataSet.ReadXml("D:\Daten\Datei.xml")
  
    Catch ex As System.Xml.XmlException
      MsgBox("Die Daten entsprechen nicht dem vorgegebenen Schema: " & ex.Message)
  
    Catch ex As Exception
      MsgBox("Fehler beim Einlesen von Daten: " & ex.Message)
  
    End Try

Mathias Schiffer widmet sich als freier Softwareentwickler und Technologievermittler größeren Projekten ebenso wie arbeitserleichternden Alltagslösungen. Seit Jahren gibt er sein Wissen in unzähligen Publikationen auch an andere Entwickler und Entscheider weiter. Sie erreichen ihn per E-Mail an die Adresse Schiffer@mvps.org.


Anzeigen: