我有一个程序,在“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)。那么我该如何获得图像流?
答案 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)