Где спрятаны мои ресурсы? - PullRequest
8 голосов
/ 13 июля 2011

У меня есть программа, которая содержит несколько значков в папке «Значки» (которые включены в проект с Build Action = Resource).

В XAML я могу получить доступ к этим значкам с помощью кода, такого как<Image Source="../Icons/name.png"/> ("..", потому что XAML находится в другой подпапке);однако я хочу использовать одно и то же изображение в некотором коде WinForms в том же проекте.К сожалению,

GetType().Assembly.GetManifestResourceStream("Icons/name.png");

возвращает null, а

GetType().Assembly.GetManifestResourceNames()

содержит только список файлов * .resources (по одному на каждый .resx и один с именем * .g.resources).Так как же мне получить поток изображения?

Ответы [ 3 ]

7 голосов
/ 15 июля 2011

Я предположил, что, поскольку я включил изображения напрямую в свой проект, я мог их непосредственно прочитать.Но благодаря ответу Джека я смог выяснить, что они скрыты внутри «файла ресурсов» с именем «ProgramName.g.resources» внутри сборки.Чтобы прочитать изображение, необходимо сначала загрузить файл ресурса, а затем выполнить поиск файла изображения в файле ресурса.

ResourceSet.GetObject чувствительно к регистру, но путь к изображению и имя файла были преобразованы в нижний регистр дляпо какой-то причине, поэтому я называю ToLowerInvariant по пути.Вот мое решение:

private Stream GetGlobalResourceByPath(Assembly assembly, string path)
{
    string name = assembly.GetManifestResourceNames().Where(n => n.EndsWith(".g.resources")).First();
    Stream outerStream = assembly.GetManifestResourceStream(name);
    ResourceSet resources = new ResourceSet(outerStream);
    return resources.GetObject(path.ToLowerInvariant()) as UnmanagedMemoryStream;
}

Я не уверен, насколько дорого построить ResourceSet.Если это дорого, и вы хотите получить несколько ресурсов, то вам следует кэшировать и повторно использовать объект ResourceSet.

Пожалуйста, оставьте сообщение, если вы знаете, почему изображения оказываются внутри * .g.файл ресурсов.Visual Studio выбрал это имя?Теоретически возможно поместить изображения непосредственно в сборку, или сборки могут содержать только «ResourceSets»?

2 голосов
/ 13 июля 2011

Вы можете найти помощь от:

http://blog.devarchive.net/2007/12/net-assembly-resource-browser-test.html

http://msdn.microsoft.com/en-us/library/system.io.unmanagedmemorystream.aspx

В первой ссылке вы можете найти способ получить ресурс типа UnmanagedMemoryStream, затем вы должны найти способ преобразовать поток в нужный вам тип.

Надеюсь, это поможет вам!


foreach (var resourceName in ThemeList.Current.GetType().Assembly.GetManifestResourceNames())
{
                var resourceStream = GetType().Assembly.GetManifestResourceStream(resourceName);
                ResourceSet resources = new ResourceSet(resourceStream);
                IDictionaryEnumerator enu = resources.GetEnumerator();
                while (enu.MoveNext())
                {
                    Console.WriteLine(enu.Key); // Key is the resource name and Value is UnmanagedMemoryStream
                }
}
0 голосов
/ 13 июля 2011

Помогает ли эта ссылка?Он демонстрирует программную загрузку ресурса ...

http://igorshare.wordpress.com/2009/01/07/wpf-extracting-bitmapimage-from-an-attached-resource-in-referenced-assemblylibrary/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...