Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
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.
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.