2012-05-02 17 views
16

En mi solicitud Compilo otro programa de archivo Source.cs usando CodeDom.Compiler y lo integrar algunos recursos (archivos EXE y DLL) en tiempo de compilación usando:Cómo leer un recurso incrustado como una matriz de bytes sin escribirlo en el disco?

// .... 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 

En el archivo compilado, tengo que leer los recursos incrustados como una matriz de bytes. Ahora estoy haciendo que mediante la extracción de los recursos en el disco utilizando la función de abajo y el uso

File.ReadAllBytes("extractedfile.exe"); 
File.ReadAllBytes("extracteddll.dll"); 

hago esto después de extraer los dos archivos en el disco utilizando esta función:

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(); 
} 

¿Cómo puedo hacer lo mismo (Obtener los recursos incrustados como una matriz de bytes) pero sin escribir nada en el disco duro?

Respuesta

23

En realidad, ya está leyendo la secuencia de una matriz de bytes, ¿por qué no simplemente detenerse allí?

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; 
    } 
} 

corregir: Consultar los comentarios para un patrón de lectura preferible.

+1

Actualicé mi respuesta, no hay necesidad de una secuencia de memoria cuando ya está leyendo la secuencia a una matriz de bytes. – Rotem

+2

Esto puede no funcionar correctamente, porque 'Stream.Read()' puede no devolver todos los datos en un 'Read()'. No estoy seguro de cómo se comporta este 'Stream' específico, pero para estar seguro usaría 'MemoryStream',' CopyTo() 'para eso y luego usar' ToArray() '. – svick

+0

@svick: tienes razón. Alternativamente, uno puede usar el patrón de lectura descrito en el ejemplo en esta página: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx – Rotem

Cuestiones relacionadas