Подтвердить что ты не робот

Ресурс из сборки как поток

У меня есть образ в приложении 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();
}

С чем мне не повезло.

4b9b3361

Ответ 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);
    }
}