Cómo descubrir dinámicamente todos los archivos XAML en todos los módulos en una aplicación Silverlight Prism

¿Hay una manera fácil de descubrir dinámicamente todos los archivos XAML dentro de todos los módulos cargados actualmente (específicamente de una aplicación Silverlight Prism)? Estoy seguro de que esto es posible, pero no estoy seguro de por dónde empezar.

Esto tiene que ocurrir en el cliente Silverlight: por supuesto, podríamos analizar los proyectos en la máquina de desarrollo, pero eso reduciría la flexibilidad e incluiría archivos no utilizados en la búsqueda.

Básicamente queremos poder analizar todos los archivos XAML en un proyecto Prism muy grande (independiente de cargarlos) para identificar todas las cadenas de localización. Esto nos permitirá crear una base de datos de localización inicial que incluya todas nuestras cadenas de enlace de recursos y también crear una búsqueda de los archivos XAML en los que se encuentran (para facilitar la edición para los traductores).

¿Por qué hacer esto ?:Lo peor para los traductores es cambiar una cadena en un contexto solo para descubrir que se usó en otro lugar con un significado ligeramente diferente. Estamos habilitando la edición en contexto de las traducciones desde la propia aplicación.

Actualización (14 de septiembre):

El método estándar para iterar ensamblajes no está disponible para Silverlight debido a restricciones de seguridad. Esto significa que la única mejora para la solución a continuación sería cooperar con la administración del módulo Prism si es posible. Si alguien quiere proporcionar una solución de código para la última parte de este problema, ¡hay puntos disponibles para compartir con usted!

Seguimiento:

Iterar el contenido de los archivos XAP en un proyecto basado en un módulo parece algo muy útil para poder hacer por varias razones, por lo que poner otros 100 representantes para obtener una respuesta real (preferiblemente un código de ejemplo de trabajo). Saludos y buena suerte!

Solución parcial a continuación (funciona pero no es óptima):

A continuación se muestra el código que se me ocurrió, que es una combinación de técnicas deeste enlace en recursos integrados (según lo sugerido por Otaku) y mi propia iteración del Catálogo del Módulo Prism.

Problema 1: todos los módulos ya están cargados, por lo que básicamente es tener que descargarlos por segunda vez, ya que no puedo resolver cómo iterar todos los módulos Prism cargados actualmente. Si alguien quiere compartir la recompensa por esto, ¡aún puede ayudar a que sea una solución completa!

Problema 2: aparentemente hay un error en el ResourceManager que requiere que obtenga la secuencia de un recurso conocido antes de que le permita iterar todos los elementos del recurso (vea la nota en el código a continuación). Esto significa que tengo que tener un archivo de recursos ficticio en cada módulo. Sería bueno saber por qué se requiere esa llamada GetStream inicial (o cómo evitarla).

private void ParseAllXamlInAllModules()
{
    IModuleCatalog mm = this.UnityContainer.Resolve<IModuleCatalog>();
    foreach (var module in mm.Modules)
    {
        string xap = module.Ref;
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += (s, args) =>
        {
            if (args.Error == null)
            {
                var resourceInfo = new StreamResourceInfo(args.Result, null);
                var file = new Uri("AppManifest.xaml", UriKind.Relative);
                var stream = System.Windows.Application.GetResourceStream(resourceInfo, file);
                XmlReader reader = XmlReader.Create(stream.Stream);
                var parts = new AssemblyPartCollection();
                if (reader.Read())
                {
                    reader.ReadStartElement();
                    if (reader.ReadToNextSibling("Deployment.Parts"))
                    {
                        while (reader.ReadToFollowing("AssemblyPart"))
                        {
                            parts.Add(new AssemblyPart() { Source = reader.GetAttribute("Source") });
                        }
                    }
                }
                foreach (var part in parts)
                {
                    var info = new StreamResourceInfo(args.Result, null);
                    Assembly assy = part.Load(System.Windows.Application.GetResourceStream(info, new Uri(part.Source, UriKind.Relative)).Stream);
                    // Get embedded resource names
                    string[] resources = assy.GetManifestResourceNames();
                    foreach (var resource in resources)
                    {
                        if (!resource.Contains("DummyResource.xaml"))
                        {
                            // to get the actual values - create the table
                            var table = new Dictionary<string, Stream>();
                            // All resources have “.resources” in the name – so remove it
                            var rm = new ResourceManager(resource.Replace(".resources", String.Empty), assy);
                            // Seems like some issue here, but without getting any real stream next statement doesn't work....
                            var dummy = rm.GetStream("DummyResource.xaml");
                            var rs = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, false, true);
                            IDictionaryEnumerator enumerator = rs.GetEnumerator();
                            while (enumerator.MoveNext())
                            {
                                if (enumerator.Key.ToString().EndsWith(".xaml"))
                                {
                                    table.Add(enumerator.Key.ToString(), enumerator.Value as Stream);
                                }
                            }
                            foreach (var xaml in table)
                            {
                                TextReader xamlreader = new StreamReader(xaml.Value);
                                string content = xamlreader.ReadToEnd();
                                {
                                    // This is where I do the actual work on the XAML content
                                }
                            }
                        }
                    }
                }
            }
        };
        // Do the actual read to trigger the above callback code
        wc.OpenReadAsync(new Uri(xap, UriKind.RelativeOrAbsolute));
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta