[Gelöst] CSharpCodeProvider bzw. CodeDomProvider - Auf Eingebundene Ressourcen zugreifen?
-
hey, hou.
Also, mein Problem ist im Titel eigentlich schon passend erläutert: Angenommen ich habe:
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp"); tbErrors.Text = ""; System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); parameters.GenerateExecutable = true; parameters.OutputAssembly = "myEXE.exe"; foreach (object o in lbReferences.Items) //lbReferences = ListBox für referenzierte Assemblys parameters.ReferencedAssemblies.Add(o.ToString()); parameters.EmbeddedResources.Add("myFile.png"); CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, tbCode.Text); if (results.Errors.Count > 0) { tbErrors.ForeColor = Color.Red; // tbErrors = TextBox für Fehlerausgabe foreach (CompilerError CompErr in results.Errors) { tbErrors.Text = tbErrors.Text + "Line number " + CompErr.Line + ", Error Number: " + CompErr.ErrorNumber + ", '" + CompErr.ErrorText + ";" + Environment.NewLine + Environment.NewLine; } }
wie kann ich nun auf die Datei zugreifen und sie z.B. abspeichern. Es gibt zwar eine Menge im Netz, aber ich werd nicht wirklich schlau draus. Hat jemand mal ein geignetes Beispiel oder weiß was damit anzufangen, was man im Internet sonst noch so findet?
Danke im Voraus.
#darius.
-
Hier gibts auch ein Beispiel:
-
Soweit, sogut.
Aber wie kann ich dann aus der Anwendung darauf zugreifen?
-
So. Es geht jetzt mehr oder WENIGER. Das ganze sieht dann ungefähr so aus. ·
Hinzufügen:ResourceWriter rw = new ResourceWriter("files.resources"); rw.AddResource("yodo", File.ReadAllBytes("file-in.txt")); rw.Close(); parameters.EmbeddedResources.Add("files.resources");
Auslesen:
ResourceReader rr = new ResourceReader(System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceNames()[0]); byte[] file; string str; rr.GetResourceData("yodo", out str, out file); File.WriteAllBytes("file-out.txt", file);
Wie vielleicht auffällt löse ich das ganze über ein ByteArray. Ich habe nun aber das Problem, dass Paint und andere Bildbearbeitungsprogramme die am Ende "exportierte" Bild-Datei garnicht erst öffnen möchte: `Paint:
file-out.png
Die Datei konnte nicht gelesen werden.
Dies ist keine gültige Bitmapdatei, oder das Format wird nicht unterstützt.`
und bei der Textdatei werden am Anfang diese 2 Zeichen hinzugefügt:>>·<< (<<; >> gehören nicht dazu) sieht aus wie eins sind aber 2. Um das zu sehen einfach nach Notepad kopieren.Hat jemand dazu noch ne Idee??
-
Blöde Frage, vielleicht ist eine Textdatei wirklich keine gültige Bitmapdatei? Versuchs mal mit etwas weniger verwirrendem
Grundsätzlich sollte beim Auslesen natürlich dasselbe rauskommen wie das was du reinsteckst. Ich hab das auch noch nie gemacht. Was ich mir notfalls vielleicht vorstellen könnte wäre, dass die Daten an irgendeiner Stelle als Text interpretiert werden und das dabei das Encoding geändert wird. Wobei ich mir das bei ReadAllBytes und WriteAllBytes auch nicht wirklich vorstellen kann.
-
Hast natürlich recht.
Ich muss aber gestehen, dass ich den Dateinamen in der Mitteilung geändert hatte. War also nur ein Übertragungsfehler. Die Fehlermeldung lautete 1 zu 1 übertragen: [Copy aus MessageBox]
`Paint
C:\Users\Darius\Desktop\yodo.png
Die Datei konnte nicht gelesen werden.
Dies ist keine gültige Bitmapdatei, oder das Format wird nicht unterstützt.
OK`
Ich hatte es einmal mit einer Text- und einmal mit einer Bilddatei gemacht. Da ist mir was durcheinander geraten. Ich editiere dann den alten Beitrag nochmal.
Danke für die schnelle Antwort. Und das:
Mechanics schrieb:
Wobei ich mir das bei ReadAllBytes und WriteAllBytes auch nicht wirklich vorstellen kann.
hatte ich nämlich auch gedacht. Ist ja Sinn der Aktion das es einfach mit jeder Art Datei funktioniert. Glaubst du / bzw. glaubt ihr es hilft, das ganze Stattdessen mit einem Stream zu lösen anstatt dem ByteArray??
[Edit:] Ich hab grad' nochmal interessehalber eine *.png-Datei umbenannt und probiert mit Paint zu öffnen. Das geht sogar.
-
#Darius# schrieb:
Glaubst du / bzw. glaubt ihr es hilft, das ganze Stattdessen mit einem Stream zu lösen anstatt dem ByteArray??
Nein, das wirds wohl nicht sein. Ich könnte mir eher vorstellen, dass der Ressourcenmanager hier was kaputtmacht, das ist wohl die komplexere Komponente. Ressourcen sind ja Locale spezifisch, vielleicht wird das irgendwo irgendwas angepasst...
Ist aber immer noch wahrscheinlicher, dass du irgendwo was falsch machst. Versuch einfach mal eine Datei zu den Ressourcen hinzuzufügen, dann wieder auszulesen und abzuspeichern und schau, ob die sich unterscheiden. Kannst z.B. mit fc auf der Kommandozeile machen. Und wenn die sich unterscheiden, wär vielleicht noch interessant, worin genau die sich unterscheiden.
-
Okey. Hab das ganze jetzt mit der CMD und einem Tool namens KDIFF3 oder so geprüft und beide nennen den einzigen Unterschied, dass die Datei, nachdem sie aus den Resourcen exportiert wurde, am Anfang um >>—) << (wieder ohne << und >>) ergenzt wurde. also das gleiche in grün wie bei der Text-Datei nur mit anderem Unfung davor. Und das kann ich mir nicht wirklich mit den mir bekannten Encodings etc. erklären.
Jemand ne Idee?
-
Was hat das Zeichen binär für einen Wert? Ist es vielleicht eine Art Byte Order Mark?
-
Hey.
Entschuldigt die lange Pause, aber ich war viel anderweitig beschäftigt.
Habe jetzt die Lösung gefunden und zwar entsprechen die vorangefügten Zeichen immer 4 Bytes. Diese entferne ich einfach routinemäßig und die Sache läuft.Danke vor Allem an Mechanics für die Freundliche Unterstützung
-
Achso. Und natürlich an alle dies interessiert noch einmal die vollständige Methode (bzw. Klasse) zum Auslesen:
// Verweis zu System.Core.dll using System.Linq; public static class Resources { public static byte[] GetResource(string tag) { System.Resources.ResourceReader rr = new System.Resources.ResourceReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()[0])); string str; byte[] file; rr.GetResourceData(tag, out str, out file); System.Collections.Generic.List<byte> fileList = file.ToList<byte>(); fileList.RemoveRange(0, 4); file = fileList.ToArray(); return file; } }
Tag ist dabei der Name der Resource. Wenn man die Datei also mit
ResourceWriter rw = new ResourceWriter("files.resources"); rw.AddResource("yodo", File.ReadAllBytes("file-in.txt"));
hinzufügt muss man bei tag "yodo" angeben.
Hinweis: Das ganze ist lediglich für die Nutzung mit einer Resources-Datei ausgelegt, aber einfach für mehrere Dateien erweiterbar.