2011-07-12 190 views
8

我有一个程序,其中包含一个“图标”文件夹中的图标(这是包含在项目与生成行动=资源)的数量。我的资源隐藏在哪里?

在XAML中,我可以使用代码访问这些图标,例如<Image Source="../Icons/name.png"/>(“..”,因为XAML位于不同的子文件夹中)。但是我想在同一个项目中的某些WinForms代码中使用相同的图像。不幸的是,

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

回报null

GetType().Assembly.GetManifestResourceNames() 

只列出了一堆*的.resources文件(每个的.resx和一个叫* .g.resources)。那么我该如何获得图像流?

回答

7

我以为,因为我包含在我的项目中图片直接,我可以直接阅读。但是,由于杰克的回答,我能够弄清楚它们隐藏在程序集内名为“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.resources文件内,请留言。 Visual Studio是否选择了这个名字?理论上可以将图像直接放在程序集中,还是程序集只包含“ResourceSets”?

+0

当我想要包含图像,javascript,css etceteras时,我没有打扰资源文件。我直接在项目中使用“嵌入式资源”的构建操作,因此不必乱用任何资源集。 –

2

,你可以找到一些帮助:

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 
       } 
} 
+1

这很有帮助,谢谢。我的答案在下面。 – Qwertie