2009-09-07 10 views
27

Tengo una imagen en una aplicación C# WPF cuya acción de compilación está configurada como 'Recurso'. Es solo un archivo en el directorio fuente, no se ha agregado a la colección de recursos de la aplicación a través del cuadro de diálogo de propiedades de arrastrar/soltar. Intento escribirlo como una secuencia, pero no puedo abrirlo a pesar de probar bastantes variaciones de puntos, barras, espacios de nombres y aparentemente todo lo demás.Recurso del ensamblado como una secuencia

Puedo acceder a él para utilizarlo en cualquier otro lugar, ya sea en xaml con "paquete: // aplicación: ,,,/Resources/images/flags/tr.png", pero no puedo acceder a una secuencia que lo contiene.

mayoría de los lugares parecen decir el uso

using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png"))) { 
    using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) { 
     while((read = reader.Read(buffer, 0, buffer.Length)) > 0) { 
      writer.Write(buffer, 0, read); 
     } 
     writer.Close(); 
    } 
    reader.Close(); 
} 

que no he tenido ninguna suerte con.

Respuesta

23

GetManifestResourceStream es por los recursos tradicionales .NET es decir, aquellos que se hace referencia en los archivos RESX. Estos no son los mismos que los recursos de WPF, es decir, los que se agregan con una acción de compilación de Recurso. Para acceder a ellos, debe usar Application.GetResourceStream, pasando el paquete apropiado: URI. Esto devuelve un objeto StreamResourceInfo, que tiene una propiedad Stream para acceder a los datos del recurso.

+0

Gracias, nunca hubiera encontrado eso. :) – Echilon

1

No es necesario llamar al método Close(), será invocado automáticamente por Dispose() al final de la cláusula de uso. Así que el código podría tener este aspecto:

using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png"))) 
using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) 
{ 
    while((read = reader.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     writer.Write(buffer, 0, read); 
    } 
} 
+0

¿Cómo responde esto la pregunta? –

+0

¿De verdad? Información útil si es verdad. Siempre pensé que llamar explícitamente a Close era mejor para streams/archivos. – Echilon

+0

El uso de la instrucción Using llama explícitamente al método dispose de Stream que implícitamente llama al método Close. Además, la sentencia using siempre descarta el objeto "usado", incluso si se genera una excepción, por lo que el uso es una declaración de todo incluido, casi sin fallas. – BeardinaSuit

6

Si te consigo la derecha, tiene un problema para abrir el flujo de recursos, porque no se sabe su nombre exacto? Si es así, puede usar

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames() 

para obtener una lista de nombres de todos los recursos incluidos. De esta forma puedes encontrar el nombre del recurso que fue asignado a tu imagen.

+0

¿Por qué no utilizar 'GetCallingAssembly' en lugar de' GetExecutingAssembly'? – Odys

25

Probablemente se esté buscando Application.GetResourceStream

StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/foo.png")); 
if (sri != null) 
{ 
    using (Stream s = sri.Stream) 
    { 
     // Do something with the stream... 
    } 
} 
+4

Para agregar, los archivos deben estar compilados como "Recurso". http://stackoverflow.com/a/7394894/355264 –

Cuestiones relacionadas