leer guardar from fichero escribir convertir bytes arreglo array archivo c# .net embedded-resource codedom system-codedom-compiler

c# - guardar - ¿Cómo leer un recurso incrustado como una matriz de bytes sin escribirlo en el disco?



leer arreglo de bytes c# (2)

En mi aplicación, compilo otro programa desde el archivo source.cs usando CodeDom.Compiler e inserto algunos recursos (archivos exe y dll) en tiempo de compilación usando:

// .... 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, necesito leer los recursos incrustados como una matriz de bytes. Ahora lo estoy haciendo extrayendo los recursos al disco usando la función a continuación y el uso

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

Hago esto después de extraer los dos archivos al disco usando 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?


En realidad, ya estás leyendo el flujo a una matriz de bytes, ¿por qué no parar ahí?

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

edición: ver comentarios para un patrón de lectura preferible.


Keep in mind that Embedded resource filename = Assemblyname.fileName `string fileName = "test.pdf"; System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly(); string fileName = a.GetName().Name + "." + "test.pdf"; using (Stream resFilestream = a.GetManifestResourceStream(fileName)) { if (resFilestream == null) return null; byte[] ba = new byte[resFilestream.Length]; resFilestream.Read(ba, 0, ba.Length); var byteArray= ba; }`