Ressource als Stream auslesen

07/10/2009 - 15:24 von Armin Zingler | Report spam
Hi,

ich steh' grad aufm Schlauch...

Zum Projekt gehöert die Datei "Resources.resx" mit der Einstellung
Buildvorgang=Eingebettete Ressource. "Resources.resx" enthàlt 3 Ressourcen
vom Typ "System.Byte[]" mit den Namen "L", "M", und "R"

Mein Ziel ist es, z.B. die Ressource "L" als Stream zu öffnen. Das bekomme ich
nicht hin.

Wenn ich mir zur Laufzeit mit Assembly.GetManifestResourceNames die Namen anzeigen lasse,
wird die Ressource als "Projektname.Resources.resources" gelistet. Mit

Assembly.GetManifestResourceStream("Projektname.Resources.resources")

kann ich zwar einen Stream öffnen, aber wie bekomme ich Zugriff auf die Ressourcen
"L", "M" oder "R" innerhalb des Streams? Es gibt zwar den System.Resources.ResourceReader,
aber der liefert mir die jeweilige Ressourcen als Byte() und nicht als Stream zurück.

Ich könnte den Umweg gehen, das Byte-Array anschließend wieder in einen
MemoryStream zu schreiben, aber diese Kopiererei möchte ich vermeiden.


Mit dem ResourceManager verhàlt es sich (natürlich) nicht anders:

Dim rm As New ResourceManager("Projektname.Resources", Assembly.GetExecutingAssembly)
Dim st = rm.GetStream("L")

Fehler in letzter Zeile: "Die Ressource 'L' ist kein Stream. Rufen Sie GetObject auf."
Ja schön, nur wenn ich rm.GetObject aufrufe, bekomme ich wieder ein Byte() zurück, aber
keinen Stream.

Geht das also gar nicht? Übersehe ich was?

Wenn ein ctor von IO.MemoryStream wenigstens einen IntPtr als Parameter annehmen würde,
dann könnte ich das Byte() pinnen und die Adresse an den MemoryStream übergeben. Würde
1x kopieren sparen. Ach ja, "managed" ist schon manchmal umstàndlich...


Armin
 

Lesen sie die antworten

#1 Thorsten Doerfler
08/10/2009 - 15:43 | Warnen spam
Armin Zingler schrieb:
Zum Projekt gehöert die Datei "Resources.resx" mit der Einstellung
Buildvorgang=Eingebettete Ressource. "Resources.resx" enthàlt 3 Ressourcen
vom Typ "System.Byte[]" mit den Namen "L", "M", und "R"

Mein Ziel ist es, z.B. die Ressource "L" als Stream zu öffnen. Das bekomme ich
nicht hin.

Wenn ich mir zur Laufzeit mit Assembly.GetManifestResourceNames die Namen anzeigen lasse,
wird die Ressource als "Projektname.Resources.resources" gelistet. Mit

Assembly.GetManifestResourceStream("Projektname.Resources.resources")

kann ich zwar einen Stream öffnen, aber wie bekomme ich Zugriff auf die Ressourcen
"L", "M" oder "R" innerhalb des Streams?



Über einen ResourceManager. :-)

Anders sieht das aus, wenn Du beliebige Dateien, die keine Ressourcen
Dateien (*.resx) sein müssen, als Ressource einbettest. Hier kannst Du
dann über GetManifestResourceStream diese Daten anzapfen. Beispiele
wàren Grafiken, Textdateien, Binàrdateien. Dein Byte-Array müsstest Du
so also zunàchst in eine Datei schreiben und diese als eingebettete
Ressource dem Projekt hinzufügen.

Es gibt zwar den System.Resources.ResourceReader,
aber der liefert mir die jeweilige Ressourcen als Byte() und nicht als Stream zurück.



Weil Du sie auch als Byte() hinzugefügt hast. Das ist der Vorteil an
typsicheren Ressourcen.

Mit dem ResourceManager verhàlt es sich (natürlich) nicht anders:

Dim rm As New ResourceManager("Projektname.Resources", Assembly.GetExecutingAssembly)
Dim st = rm.GetStream("L")

Fehler in letzter Zeile: "Die Ressource 'L' ist kein Stream. Rufen Sie GetObject auf."
Ja schön, nur wenn ich rm.GetObject aufrufe, bekomme ich wieder ein Byte() zurück, aber
keinen Stream.

Geht das also gar nicht?



Wenn Du Dein Byte-Array vorher in einen MemoryStream schiebst und diesen
in die Resource schreibst, dann kannst Du auch über
ResourceManager.GetStream() das ganze wieder als Stream auslesen. Ohne
Konvertierung auf der einen oder anderen Seite geht es allerdings m.W.
nicht.

Ich setze jetzt einfach voraus, dass Du Deine resources.resx in diesem
Fall manuell erstellst, da ich im Designer keine Möglichkeit gefunden
habe, ein Byte-Array als Eintrag anzulegen.

Thorsten Dörfler
Microsoft MVP Visual Basic

vb-hellfire visual basic faq | vb-hellfire - einfach anders
http://vb-faq.de/ | http://www.vb-hellfire.de/

Ähnliche fragen