混淆资源和GetManifestResourceNames()

pik*_*chu 15 c# resources winforms

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

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

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

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

Fel*_*ano 14

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


Tej*_*rma 10

我不知道你是否仍然需要这个问题的答案,但根据我的经验,我会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); 
}
Run Code Online (Sandbox Code Playgroud)


Zac*_*ack 7

由于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;
}
Run Code Online (Sandbox Code Playgroud)

这实际上是从这篇文章中(A WCF,WPF的聊天应用)伊斯兰教ElDemery