Загрузить ResourceDictionary из сборки - PullRequest
16 голосов
/ 02 апреля 2009

У меня есть сборка где-то в файловой системе, например "C: \ Temp \ test.dll". В этой сборке есть ResourceDictionary, например, "Abc.xaml".

Как я могу получить этот ResourceDictionary? Может быть, есть способ с помощью Reflections? Пока не нашел решения.

Заранее спасибо!

Изменить: Просто хотел добавить, что я хочу получить доступ к ресурсам в словаре, например, Стиль.

Ответы [ 3 ]

21 голосов
/ 28 мая 2009

Вам действительно нужно написать Uri так:

Assembly.LoadFrom(@"C:\temp\test.dll");
ResourceDictionary rd = new ResourceDictionary();
rd.Source = new Uri(@"pack://application:,,,/test;component/myresource.xaml");
10 голосов
/ 03 апреля 2009

Редактировать: Я нашел еще лучшее решение, которое работает с ResourceDictionaries:

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

Ну, я не мог заставить его работать с ResourceDictionaries, поэтому вместо этого я использую старые добрые файлы ресурсов;) Для всех интересующихся вот как я это сделал:

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

Вы можете получить «NameOfResource» с помощью Reflector, как предложил Иан.

2 голосов
/ 02 апреля 2009

Возьмите копию Отражатель (Латс передал это сейчас). Используйте это, чтобы посмотреть на сборку, пространство имен и т. Д. Ресурсов в ней.

Затем прочитайте во встроенном ресурсе что-то вроде этого;

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();
    }
}
...