2009-09-07 44 views
27

我在C#WPF应用程序中将其构建操作设置为'Resource'。它只是源目录中的一个文件,它没有通过拖放属性对话框添加到应用程序的资源集合中。我试图把它写成流,但是尽管尝试了很多点,斜杠,命名空间和看似其他所有的变体,我仍然无法打开它。程序集中的资源作为流

我可以在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(); 
} 

我已经没有任何运气。

回答

23

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

+0

谢谢,我从来没有发现。 :) – Echilon 2009-09-07 09:49:30

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

这是如何回答这个问题的? – 2009-09-07 07:52:43

+0

真的吗?有用的见解,如果它是真的。我一直认为明确调用Close对于流/文件更好。 – Echilon 2009-09-07 12:13:52

+0

Using语句的使用明确调用Stream的dispose方法,它隐式调用它的Close方法。即使引发异常,using语句也总是处理“used”对象,所以using是一个包含全部的,几乎没有错误的语句。 – BeardinaSuit 2010-08-12 17:36:27

6

如果我得到你的权利,你需要打开资源流的问题,因为你不知道它的确切名字吗?如果是这样,您可以使用

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

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

+0

为什么不使用'GetCallingAssembly'而不是'GetExecutingAssembly'? – Odys 2013-03-19 09:09:46

25

你可能寻找Application.GetResourceStream

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

要添加,必须将文件构建为“资源”。 http://stackoverflow.com/a/7394894/355264 – 2013-05-13 15:21:27