none
WPF中,如何得到DLL文件中的所有资源? RRS feed

  • 问题

  • 在WPF中,可以这样访问一个图形文件 

    Uri uri = new Uri("pack://application:,,/images/" + picturename); 

    现在我希望能够得到程序集中所有的这些picturename,应当怎么样写代码呢?

    2011年12月23日 21:02

答案

  • 我们.Net程序集一般来讲是有嵌入式资源的,通常在Winform中,我们把这些图片,图标,字体文件等编译成嵌入式资源:

    而WPF中加入了一种新的编译类型, Resource。WPF的资源就如同你所说的,我们可以通过Pack Uri (http://msdn.microsoft.com/zh-cn/library/aa970069.aspx)来获取,这大大方便我们WPF的程序的开发和资源的整合(XAML源码文件在编译后生成的Baml文件其实也是被存放在WPF Resource中的)

    不过,虽然WPF用了新的方式管理资源,但是它还是和嵌入资源一样存放在程序集相同的资源块中。如下图,我在一个WPF程序中加入了一个嵌入资源和资源,他们同时在程序集资源中(通过反射工具可以看到)

    不管你是用那种方式来存储资源信息,我们都可以通过反射的代码来读取他们:

          StringBuilder sb = new StringBuilder();
          Assembly assembly = Assembly.GetExecutingAssembly();
          string[] names = assembly.GetManifestResourceNames();
          
          foreach (string name in names)
          {
            //assembly.GetManifestResourceInfo(name).ResourceLocation;
            Stream st = assembly.GetManifestResourceStream(name);
            try
            {
              using (ResourceReader resourceReader = new ResourceReader(st))
              {
                sb.AppendLine(name);
                foreach (DictionaryEntry resourceEntry in resourceReader)
                {
                  sb.AppendLine("\t|- " + resourceEntry.Key);
                }
              }
            }
            catch (System.ArgumentException ex)
            {
              sb.AppendLine(name);
            }
          }
          MessageBox.Show(sb.ToString());
    

     

    例子下载:https://skydrive.live.com/?cid=51b2fdd068799d15#cid=51B2FDD068799D15&id=51B2FDD068799D15%21888

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年12月26日 8:55
    版主