来自程序集的资源作为流

时间:2009-09-07 07:42:50

标签: c# wpf embedded-resource

我在C#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();
}

我没有运气。

4 个答案:

答案 0 :(得分:26)

您可能正在寻找Application.GetResourceStream

StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/foo.png"));
if (sri != null)
{
    using (Stream s = sri.Stream)
    {
        // Do something with the stream...
    }
}

答案 1 :(得分:25)

GetManifestResourceStream用于传统的.NET资源,即RESX文件中引用的资源。这些与WPF资源不同,即那些添加了Resource的构建操作的资源。要访问这些,您应该使用Application.GetResourceStream,传入相应的包:URI。这将返回一个StreamResourceInfo对象,该对象具有Stream属性以访问资源的数据。

答案 2 :(得分:6)

如果我说得对,那么打开资源流会有问题,因为你不知道它的确切名称?如果是这样,你可以使用

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()

获取所有包含资源的名称列表。这样,您就可以找到分配给您图像的资源名称。

答案 3 :(得分:1)

不需要调用Close()方法,它将在using子句的末尾由Dispose()自动调用。所以你的代码可能如下所示:

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);
    }
}