2010-03-25 20 views
11

Tengo un conjunto de recursos con archivos de imagen que se generan utilizando Recurso o Contenido acción de compilación. Esto hace que estos archivos sean accesibles usando el Uris. Sin embargo, no puedo encontrar la manera de enumerar dichos recursos.
Si fijo la acción de generación para Recurso incrustado se hace posible enumerar los archivos con el siguiente código:Enumeración de recursos de ensamblado .NET en tiempo de ejecución

string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames(); 

pero a su vez hace que estos archivos inaccesibles usando URIs.

La pregunta es - cómo enumerar los recursos que se compilan con cualquiera de Recursos o contenido de Acción de generación?

NOTA: Como señaló Thomas Levesque, es posible enumerar dichos recursos aprovechando el AssemblyAssociatedContentFileAttribute, pero parece que solo funciona para los ensamblados de la aplicación WPF y no para los de la biblioteca de la clase. Entonces la pregunta aún está abierta.

Respuesta

24

Puede enumerar los AssemblyAssociatedContentFile atributos definidos en el conjunto:

var resourceUris = Assembly.GetEntryAssembly() 
        .GetCustomAttributes(typeof(AssemblyAssociatedContentFileAttribute), true) 
        .Cast<AssemblyAssociatedContentFileAttribute>() 
        .Select(attr => new Uri(attr.RelativeContentFilePath)); 

También puede comprobar this page una manera de enumerar los recursos BAML.


ACTUALIZACIÓN: en realidad la solución de arriba funciona solamente para archivos de contenido. El siguiente método devuelve todos los nombres de recursos (incluidos recursos BAML, imágenes, etc.):

public static string[] GetResourceNames() 
    { 
     var asm = Assembly.GetEntryAssembly(); 
     string resName = asm.GetName().Name + ".g.resources"; 
     using (var stream = asm.GetManifestResourceStream(resName)) 
     using (var reader = new System.Resources.ResourceReader(stream)) 
     { 
      return reader.Cast<DictionaryEntry>().Select(entry => (string)entry.Key).ToArray(); 
     } 
    } 
+0

Esto solo funciona si el conjunto tiene dichos atributos establecidos, p. La aplicación WPF lo tendría configurado automáticamente y solo para los archivos creados con la acción de compilación * Content *. En el caso del ensamblado ClassLibrary, no existen tales atributos. E incluso dentro del código ensamblador, no puedo encontrar la manera de enumerar dichos recursos. –

+0

El código en la actualización responde a la pregunta original, pero aún no es una solución universal :) En el caso de una biblioteca de clase, enumera todos los recursos creados con la acción de compilación * Content *, * Resource * y * Embedded Resource *. Pero en el caso de la aplicación WPF, solo enumera los recursos creados con la acción de compilación * Embedded Resource *. Por lo tanto, parece que para enumerar todos los recursos en la aplicación WPF, se requiere la combinación de los dos métodos anteriores. –

+0

¿Se puede refinar este fragmento de código para obtener recursos de una carpeta en particular directamente, sin la necesidad de filtrar el valor de retorno? (Por ejemplo, tengo varias carpetas de recursos (se puede ver desde el explorador de soluciones) y una de ellas contiene imágenes que deseo cargar.) – ziyuang

Cuestiones relacionadas