In meiner Anwendung kompilieren ich ein anderes Programm aus Source.cs Datei CodeDom.Compiler mit und ich einbetten einige Ressourcen (exe und DLL-Dateien) bei der Kompilierung mit:Wie lese ich eine eingebettete Ressource als Array von Bytes, ohne sie auf die Festplatte zu schreiben?
// .... rest of code
if (provider.Supports(GeneratorSupport.Resources))
{
cp.EmbeddedResources.Add("MyFile.exe");
}
if (provider.Supports(GeneratorSupport.Resources))
{
cp.EmbeddedResources.Add("New.dll");
}
// ....rest of code
In der kompilierten Datei muss ich lesen die eingebetteten Ressourcen als Array von Bytes. Ich bin, dass jetzt gerade durch die Ressourcen, auf die Festplatte extrahieren die Funktion unten und die Verwendung mit
File.ReadAllBytes("extractedfile.exe");
File.ReadAllBytes("extracteddll.dll");
ich dies tun, nachdem die beiden Dateien auf die Festplatte extrahieren Sie diese Funktion verwenden:
public static void ExtractSaveResource(String filename, String location)
{
// Assembly assembly = Assembly.GetExecutingAssembly();
System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
// Stream stream = assembly.GetManifestResourceStream("Installer.Properties.mydll.dll"); // or whatever
// string my_namespace = a.GetName().Name.ToString();
Stream resFilestream = a.GetManifestResourceStream(filename);
if (resFilestream != null)
{
BinaryReader br = new BinaryReader(resFilestream);
FileStream fs = new FileStream(location, FileMode.Create); // say
BinaryWriter bw = new BinaryWriter(fs);
byte[] ba = new byte[resFilestream.Length];
resFilestream.Read(ba, 0, ba.Length);
bw.Write(ba);
br.Close();
bw.Close();
resFilestream.Close();
}
// this.Close();
}
Wie kann ich das gleiche tun (Holen Sie die eingebetteten Ressourcen als Array von Bytes), aber ohne etwas auf die Festplatte zu schreiben?
Aktualisiert meine Antwort, keine Notwendigkeit für einen Speicherstream, wenn Sie bereits den Stream zu einem Bytearray lesen. – Rotem
Dies funktioniert möglicherweise nicht korrekt, da 'Stream.Read()' möglicherweise nicht alle Daten in einem 'Read()' zurückgibt. Ich bin mir nicht sicher, wie sich dieser spezielle "Stream" verhält, aber um auf der sicheren Seite zu sein, würde ich einen 'MemoryStream',' CopyTo() 'dazu verwenden und dann' ToArray() 'verwenden. – svick
@svick: Sie haben Recht. Alternativ kann das Lesemuster verwendet werden, das im Beispiel auf dieser Seite beschrieben wird: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx – Rotem