2009-04-02 19 views
16

Tengo un ensamblaje en algún lugar del sistema de archivos, p. "C: \ temp \ test.dll". En ese conjunto hay un ResourceDictionary, p. "abc.xaml".Cargar un ResourceDictionary de un ensamblaje

¿Cómo puedo obtener ese ResourceDictionary? Tal vez hay una forma de usar Reflections? No encontré una solución hasta el momento.

¡Gracias de antemano!

Editar: Solo quería agregar que quiero acceder a los Recursos en el Diccionario, p. un estilo.

Respuesta

10

Editar: He encontrado una solución aún mejor que trabaja con ResourceDictionaries:

Assembly.LoadFrom(@"C:\temp\test.dll"); 
ResourceDictionary rd = new ResourceDictionary(); 
rd.Source = new Uri("/test;component/myresource.xaml"); 

Bueno, no podría conseguirlo para trabajar con ResourceDictionaries, así que estoy usando buenos viejos archivos de recursos en su lugar;) Para cualquier persona interesada, así es como lo hice:

Assembly a = Assembly.LoadFile(@"C:\temp\test.dll"); 
ResourceManager rm = new ResourceManager("NameOfResource", a); 
object o = rm.GetObject("xyz"); 

Puede obtener "NameOfResource" con Reflector, como sugirió Ian.

+3

+ Siempre es bueno volver y decirnos cómo te fue con tu problema :) –

+0

Mira la respuesta de Claraoscura, es una mejor solución. – scobi

+0

Te estas perdiendo los 'UriKind' en su respuesta, si está utilizando la ruta relativa, se debe proporcionar' UriKind.Relative' – ANewGuyInTown

2

Obtenga una copia de Reflector (Lutz ha entregado esto ahora). Úselo para ver el ensamblaje y el espacio de nombres, etc. de los recursos en él.

Luego lea en el recurso incrustado algo como esto;

Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); 
using (System.IO.Stream s = asm.GetManifestResourceStream(<yourname>) 
{ 
    using (System.IO.StreamReader reader = new System.IO.StreamReader(s)) 
    { 
     string xml = reader.ReadToEnd(); 
    } 
} 
+0

Gracias. Desafortunadamente, cuando uso tu código, solo recibo basura del lector.ReadToEnd() –

+0

No tengo idea de qué aspecto tiene XAML, pero supongo que necesitas un decodificador de algún tipo. –

+0

No lo sé, pero lo hice ahora con los archivos de recursos. ¡Gracias por tu ayuda! –

21

que realmente se necesita para escribir el Uri así:

Assembly.LoadFrom(@"C:\temp\test.dll"); 
ResourceDictionary rd = new ResourceDictionary(); 
rd.Source = new Uri(@"pack://application:,,,/test;component/myresource.xaml"); 
+5

Documentación para la sintaxis Uri torpe está aquí: http://msdn.microsoft.com/en -us/library/aa970069.aspx – scobi

+1

+1 Tu leyenda, funciona perfectamente –

Cuestiones relacionadas