混淆资源和GetManifestResourceNames()

时间:2011-11-19 16:45:45

标签: c# winforms resources

我一直在学习C#和visual C#IDE中的资源。我现在很困惑。我已经阅读了StackOverflow上的一些页面,比如这个如何获取一个嵌入式资源的路径和微软的文档,但它让我很困惑。

我的第一个问题:什么是资源:是.resources文件还是其中的文件,如图标。

第二:当我使用GetManifestResourceNames方法时:我是否获得.resources文件名或其中的文件名。当我在我的程序中使用它时,我只获取.resources文件,但是阅读像这样循环遍历所有资源的resx文件的主题,我得到的印象我应该得到的名称.resources文件中的文件。

是我,还是这个术语真的有点令人困惑?任何人都可以让它更清晰一点吗?感谢您的帮助。

3 个答案:

答案 0 :(得分:13)

资源是您通过将其标记为“EmbeddedResource”而编译的任何文件,这只是将文件合并到程序集中。 GetManifestResourceNames()只是一个枚举器,它为我们提供了所有嵌入式编译资源文件的名称,例如: MyAssembly.resources。需要通过加载此资源文件的ResourceSet枚举实际资源元素。

答案 1 :(得分:9)

我不知道您是否还需要这个问题的答案,但根据我的经验GetManifestResourceNames()会返回程序集中嵌入的.resource文件的名称。

如果您想访问各个资源,您可以这样做:

Assembly assembly = Assembly.LoadFrom(assemblyName);
string[] names = assembly.GetManifestResourceNames();
ResourceSet set = new ResourceSet(assembly.GetManifestResourceStream(names[0]));
foreach (DictionaryEntry resource in set)
{
    Console.WriteLine("\n[{0}] \t{1}", resource.Key, resource.Value); 
}

答案 2 :(得分:6)

由于Felice Pollano的回答,我得到了我的项目。我在我的解决方案中添加了一个名为Images的文件夹,并在Windows资源管理器中打开该文件夹,然后将我的图像文件复制到Images文件夹中。然后进入visual studio并单击Solution Explorer顶部的“show all files”,右键单击Images文件夹中的图像文件,然后单击Include in project。然后我左键单击解决方案资源管理器中的图像文件,然后在“属性”窗口中,将构建操作设置为您提到的嵌入式资源。

这是我访问此图片的代码

private Dictionary<int, Image> GetImages()
{
  List<Stream> picsStrm = new List<Stream>();

  Assembly asmb = Assembly.GetExecutingAssembly();
  string[] picNames = asmb.GetManifestResourceNames();

  foreach (string s in picNames)
  {
    if (s.EndsWith(".png"))
    {
      Stream strm = asmb.GetManifestResourceStream(s);
      if (strm != null)
      {
        picsStrm.Add(strm);
      }
    }
  }

  Dictionary<int, Image> images = new Dictionary<int, Image>();

  int i = 0;

  foreach (Stream strm in picsStrm)
  {
    PngBitmapDecoder decoder = new PngBitmapDecoder(strm,
      BitmapCreateOptions.PreservePixelFormat,
      BitmapCacheOption.Default);
    BitmapSource bitmap = decoder.Frames[0] as BitmapSource;
    Image img = new Image();
    img.Source = bitmap;
    img.Stretch = Stretch.UniformToFill;
    images.Add(i, img);
    i++;

    strm.Close();
  }
  return images;
}

实际上是this article(A WCF-WPF Chat Application) Islam ElDemery