2012-05-02 6 views
16

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?

Antwort

23

Sie lesen den Stream tatsächlich bereits in einem Byte-Array, warum nicht einfach dort aufhören?

public static byte[] ExtractResource(String filename) 
{ 
    System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly(); 
    using (Stream resFilestream = a.GetManifestResourceStream(filename)) 
    { 
     if (resFilestream == null) return null; 
     byte[] ba = new byte[resFilestream.Length]; 
     resFilestream.Read(ba, 0, ba.Length); 
     return ba; 
    } 
} 

bearbeiten: Siehe Kommentare für eine bevorzugte Lesemuster.

+1

Aktualisiert meine Antwort, keine Notwendigkeit für einen Speicherstream, wenn Sie bereits den Stream zu einem Bytearray lesen. – Rotem

+2

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

+0

@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

Verwandte Themen