我的资源隐藏在哪里?

时间:2011-07-12 21:13:58

标签: .net resources

我有一个程序,在“Icons”文件夹中包含许多图标(包含在Build Action = Resource的项目中)。

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

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

返回null

GetType().Assembly.GetManifestResourceNames()

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

3 个答案:

答案 0 :(得分:7)

我认为,因为我在项目中直接包含图像,我可以直接阅读它们。但是由于Jack的回答,我能够发现它们隐藏在程序集内部名为“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”?

答案 1 :(得分: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
                }
}

答案 2 :(得分:0)