Ресурс из сборки как поток
У меня есть образ в приложении WPF С#, действие сборки которого установлено в "Ресурс". Это просто файл в исходном каталоге, он не был добавлен в коллекцию ресурсов приложения через диалоговое окно свойств перетаскивания. Я пытаюсь записать его как поток, но я не могу его открыть, несмотря на то, что вы пытаетесь выполнить несколько вариантов точек, косых черт, пространств имен и, по-видимому, все остальное.
Я могу получить доступ к нему для использования в другом месте либо в xaml с помощью "pack://application:,,/Resources/images/flags/tr.png", но я не могу получить поток, содержащий его.
В большинстве мест, как говорят, используется
using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png"))) {
using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) {
while((read = reader.Read(buffer, 0, buffer.Length)) > 0) {
writer.Write(buffer, 0, read);
}
writer.Close();
}
reader.Close();
}
С чем мне не повезло.
Ответы
Ответ 1
GetManifestResourceStream предназначен для традиционных ресурсов .NET, то есть тех, на которые ссылаются файлы RESX. Это не то же самое, что и ресурсы WPF, то есть те, которые добавлены с помощью действия сборки Resource. Чтобы получить к ним доступ, вы должны использовать Application.GetResourceStream, передав соответствующий URI. Это возвращает объект StreamResourceInfo, который имеет свойство Stream для доступа к данным ресурса.
Ответ 2
Возможно, вы ищете Application.GetResourceStream
StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/foo.png"));
if (sri != null)
{
using (Stream s = sri.Stream)
{
// Do something with the stream...
}
}
Ответ 3
Если я понял, что у вас есть проблема, чтобы открыть поток ресурсов, потому что вы не знаете его точное имя? Если это так, вы можете использовать
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()
чтобы получить список имен всех включенных ресурсов. Таким образом вы можете найти имя ресурса, которое было присвоено вашему изображению.
Ответ 4
Нет необходимости вызывать метод Close(), он будет автоматически вызываться Dispose() в конце предложения use. Таким образом, ваш код может выглядеть так:
using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png")))
using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile)))
{
while((read = reader.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer, 0, read);
}
}