WPF C # Reflection: итерация по всем ресурсам с помощью страницы действия сборки

У меня есть .dll с большим количеством ResourceDictionaries.

Действие сборки всех этих ResourceDictionaries установлено на «Страница».

Внутри Dll я хочу найти все эти ResourceDictionaries и перебрать их.

Если я устанавливаю действие сборки на «EmbeddedResource», я могу использовать Reflection:

var embeddedResources = Assembly.GetExecutingAssembly().GetManifestResourceNames().ToList();

Но GetManifestResourceNames () не работает для ресурсов с действием сборки «Страница».

Как найти или перебрать все ресурсы, у которых есть "страница" действия сборки?

Решением не обязательно должно быть отражение. Любой другой способ приветствуется.

Спасибо!

Решение:

Дамы и господа! Я должен объявить, что человеком недели и победителем этой награды стал мистер Джон Ву. Джон Ву дал правильный намек, и путем поиска я нашел это решение:

Перечисление ресурсов сборки .NET во время выполнения

Слегка измененный рабочий код выглядит так:

public static string[] GetResourceNames()
    {
        var asm = Assembly.GetExecutingAssembly();
        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();
        }
    }

Если вы вызовете этот метод, вы получите все строки ресурсов с расширением «.baml» в конце и сможете перебирать их.

Спасибо, Джон Ву, за правильный намек.


person Michael    schedule 20.06.2017    source источник
comment
Это твой ответ? stackoverflow.com/questions/3314140 /   -  person JWP    schedule 21.06.2017
comment
@JohnPeters: Нет. Как я прямо написал в вопросе, GetManifestResourceNames () работает только для EmbeddedResource. Это НЕ работает для страницы.   -  person Michael    schedule 21.06.2017
comment
Все элементы, отмеченные страницей, будут помещены во встроенный <WpfApplicationName>.g.resources ресурс .NET, содержащий по одному потоку для каждого словаря. Эти словари имеют формат BAML (en.wikipedia.org/wiki/), поэтому Я не уверен, что это полезно. Что бы вы хотели сделать после того, как перечислили эти потоки BAML?   -  person Simon Mourier    schedule 23.06.2017
comment
@SimonMourier: я загружаю их в оперативную память с помощью obj = Application.LoadComponent (uri) ;. Проблема в том, что как только вы скомпилируете их как EmbeddedResource, это больше не будет работать, если ResourceDictionaries имеют ссылки друг на друга. Под ссылками я имею ввиду импорт с Uri-Packs. Например: у вас есть стиль RD, который импортирует цвета из другого RD с помощью: ‹ResourceDictionary Source = / Styles; component / Gray / Colors.xaml /›.   -  person Michael    schedule 24.06.2017
comment
Почему бы вам не объединить их в приложении следующим образом stackoverflow.com/questions/27215155/ и использовать App.Current.Resources.MergedDictionaries?   -  person Simon Mourier    schedule 24.06.2017
comment
Я добавил решение вопроса. Спасибо всем, кто помогал.   -  person Michael    schedule 24.06.2017
comment
Вы должны были сказать нам, что вам нужны только словарные имена. Мой первоначальный комментарий первым дал решение   -  person Simon Mourier    schedule 24.06.2017
comment
@SimonMourier Это верно, что вы дали намек перед Джоном Ву, но я не могу отметить комментарий как правильный ответ. Я могу только проголосовать за них. Конечно, мне нужны были только имена. Если вы используете EmbeddedResources и вызываете Assembly.GetExecutingAssembly (). GetManifestResourceNames (), вы также получите только имена ресурсов. Думаю, я довольно ясно дал понять, что мне нужен GetManifestResourceNames (), но для ресурсов страницы.   -  person Michael    schedule 24.06.2017


Ответы (1)


Согласно этому ответу ,

Страница (только WPF): используется для компиляции файла xaml в baml. Затем baml внедряется тем же способом, что и ресурс (т.е. доступен как AppName.g.resources).

Похоже, вам просто нужно искать ресурсы, обозначенные YourAppName.g.resources.

person John Wu    schedule 24.06.2017
comment
ДАМЫ И ГОСПОДА! Я должен объявить, что мужчинами недели и победителями этой награды являются мистер Джон Ву и мистер Томас Левеск. Джон Ву дал правильный намек, и путем поиска я нашел следующее решение: stackoverflow.com/questions/2517407/. Я добавил решение вопроса. Спасибо, Джон Ву! - person Michael; 24.06.2017
comment
Вы получаете награду, но по правилам мне нужно подождать 2 часа, прежде чем я смогу нажать на кнопку награды. - person Michael; 24.06.2017