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?
Actualicé mi respuesta, no hay necesidad de una secuencia de memoria cuando ya está leyendo la secuencia a una matriz de bytes. – Rotem
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
@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