Перечисление ресурсов сборки.NET во время выполнения
У меня есть сборка ресурса с файлами изображений, которые построены с использованием действия сборки ресурса или контента. Это делает эти файлы доступными с помощью Uris. Однако я не могу найти способ перечислить такие ресурсы.
Если я установлю действие сборки на Embedded Resource, станет возможным перечислять файлы следующим кодом:
string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames();
но это в свою очередь делает эти файлы недоступными с помощью Uris.
Вопрос в том, как перечислить ресурсы, скомпилированные с помощью действия Resource или Content build?
ПРИМЕЧАНИЕ. Как отметил Томас Левеск, можно перечислить такие ресурсы, используя атрибут AssemblyAssociatedContentFileAttribute, но, похоже, он работает только для сборок приложения WPF, а не для сборок библиотеки классов. Так что вопрос все еще открыт.
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();
}
}