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

У меня есть сборка ресурсов с файлами изображений в нем, которые создаются с помощью действия сборки Ресурса или Содержания. Это делает эти файлы доступным использованием Uris. Однако я не могу найти способ перечислить такие ресурсы.
Если я установил действие сборки на Встроенный Ресурс, становится возможно перечислить файлы со следующим кодом:

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

но это в свою очередь делает эти файлы недоступным использованием Uris.

Вопрос - как перечислить ресурсы, которые компилируются или с действием сборки Ресурса или с Содержания?

Примечание: Поскольку Thomas Levesque указал, что возможно перечислить такие ресурсы путем усиления AssemblyAssociatedContentFileAttribute, но это, кажется, только работает на блоки Приложения WPF а не на библиотеки классов. Таким образом, вопрос все еще нерешен.

12
задан Alex_P 25 March 2010 в 18:43
поделиться

1 ответ

Вы можете перечислить атрибуты AssemblyAssociatedContentFile , определенные в сборке:

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

Вы также можете проверить эту страницу , чтобы узнать способ перечисления ресурсов BAML.


ОБНОВЛЕНИЕ: на самом деле приведенное выше решение работает только для файлов содержимого. Приведенный ниже метод возвращает все имена ресурсов (включая ресурсы BAML, изображения и т. Д.):

    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();
        }
    }
28
ответ дан 2 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: