从DLL获取图像名称作为列表?

时间:2009-06-25 13:49:53

标签: c# image dll

我创建了一个用于封装我的图像的DLL,之后我想从DLL中获取图像名称作为列表。在发布这篇文章之前,我用Google搜索了一下,我看到了一个下面的例子。

public static List<string> GetImageList()
{
    List<string> imageList;            
    System.Reflection.Assembly BOAUIResources = System.Reflection.Assembly.GetExecutingAssembly();
    string[] resources = BOAUIResources.GetManifestResourceNames();
    return resources.ToList<string>();
}

此代码只是访问构建动作属性的图像名称是“嵌入式资源”。因为在WPF中访问,我的图像构建动作类型必须定义为“资源”。

那么如何列出图像名称,构建动作属性被定义为资源,来自DLL?

2 个答案:

答案 0 :(得分:2)

图像资源可以通过几种不同的方式添加到程序集中,这会对枚举图像名称的代码产生一些影响。

  • 您可以将图像添加到resx文件。
  • 您可以将图像直接添加到解决方案中(与代码文件一样),并将其构建操作设置为“嵌入式资源”。

您在问题中提供的代码示例将适用于第二种情况。但请注意,它还会列出任何其他清单资源(例如嵌入的resx文件),而不仅仅是您的图像。

如果您已将图片添加到resx文件,则可以使用从ResourceSet获得的ResourceManager枚举资源:

// This requires the following using statements in the file:
// using System.Resources;
// using System.Collections;

ResourceManager rm = new ResourceManager(typeof(Images));
using (ResourceSet rs = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true))
{
    IDictionaryEnumerator resourceEnumerator = rs.GetEnumerator();
    while (resourceEnumerator.MoveNext())
    {
        if (resourceEnumerator.Value is Image)
        {
            Console.WriteLine(resourceEnumerator.Key);
        }
    }
}

在第一行中,它显示ResourceManager(typeof(Images)),您需要将Images与您的图片所在的资源文件的名称进行交换(在我的示例中,它被称为“图像”的.resx“)。

答案 1 :(得分:2)

试试这个。 (摘自本书 - 由Chris Sells编写的WPF编程,Ian Griffiths)

 public static List<string> GetImageList()
            {
                System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
                System.Globalization.CultureInfo culture = Thread.CurrentThread.CurrentCulture;
                string resourceName = asm.GetName().Name + ".g";
                System.Resources.ResourceManager rm = new System.Resources.ResourceManager(resourceName, asm);
                System.Resources.ResourceSet resourceSet = rm.GetResourceSet(culture, true, true);
                List<string> resources = new List<string>();
                foreach (DictionaryEntry resource in resourceSet)
                {
                    resources.Add((string)resource.Key);
                }
                rm.ReleaseAllResources();
                return resources;
            }