Перечисление ресурсов сборки .NET во время выполнения - PullRequest
11 голосов
/ 25 марта 2010

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

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

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

Вопрос в том, как перечислить ресурсы, скомпилированные с помощью Resource или Content action build?

ПРИМЕЧАНИЕ. Как отметил Томас Левеск, можно перечислить такие ресурсы, используя атрибут AssemblyAssociatedContentFileAttribute, но, похоже, он работает только для сборок приложения WPF, а не для сборок библиотеки классов. Так что вопрос все еще открыт.

1 Ответ

27 голосов
/ 25 марта 2010

Вы можете перечислить атрибуты 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();
        }
    }
...