C# 对资源和GetManifestResourceNames()感到困惑

C# 对资源和GetManifestResourceNames()感到困惑,c#,winforms,resources,C#,Winforms,Resources,我一直在学习C#和visual C#IDE中的资源。我现在很困惑。我读过一些关于StackOverflow的页面,比如这一页如何获取被盗用资源的路径和Microsoft的文档,但这让我感到困惑 我的第一个问题:什么是资源:是.resources文件还是它里面的文件,比如图标 第二:当我使用GetManifestResourceNames方法时:是获取.resources文件名还是其中的文件名。当我在我的程序中使用它时,我只得到.resources文件,但是阅读像这样的循环遍历所有资源的resx文

我一直在学习C#和visual C#IDE中的资源。我现在很困惑。我读过一些关于StackOverflow的页面,比如这一页如何获取被盗用资源的路径和Microsoft的文档,但这让我感到困惑

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

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


是我,还是这个术语真的有点混乱?有人能说得更清楚一点吗?感谢所有帮助。

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

我不知道您是否仍然需要此问题的答案,但根据我的经验
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); 
}

我的项目之所以能成功,是因为费利斯·波拉诺的回答。我在解决方案中添加了一个名为Images的文件夹,并在windows资源管理器中打开该文件夹,然后将我的图像文件复制到Images文件夹中。然后进入visual studio,单击解决方案资源管理器顶部的“显示所有文件”,右键单击“图像”文件夹中的图像文件,然后单击“包含在项目中”。然后我在解决方案资源管理器中左键单击图像文件,并在属性窗口中,将构建操作设置为嵌入资源,如您所述

这是我访问这张图片的代码

private Dictionary GetImages()
{
List picsStrm=新列表();
Assembly asmb=Assembly.getExecutionGassembly();
字符串[]picNames=asmb.GetManifestResourceNames();
foreach(picNames中的字符串s)
{
如果(s.EndsWith(“.png”))
{
Stream strm=asmb.GetManifestResourceStream;
如果(strm!=null)
{
picsStrm.Add(strm);
}
}
}
字典图像=新字典();
int i=0;
foreach(picsStrm中的流strm)
{
PngBitmapDecoder解码器=新的PngBitmapDecoder(strm,
BitmapCreateOptions.PreservePixelFormat,
BitmapCacheOption.Default);
BitmapSource位图=解码器。帧[0]作为BitmapSource;
图像img=新图像();
img.Source=位图;
img.Stretch=Stretch.UniformToFill;
添加(i,img);
i++;
strm.Close();
}
返回图像;
}

实际上,您可能缺少的步骤是将.resx文件编译为.resources文件。嵌入到程序集元数据中的二进制文件。ResourceManager可以恢复原始数据。总是喜欢资源设计师,资源管理器不容易使用。好吧,我想我越来越接近了。我将试着以我的项目为例解释你所说的话,以确保我理解。在我的项目中,我有两个.resx文件(一个是默认的,一个是我手动添加的(添加新项)),这意味着两个.resources文件,对吗。在添加的.resx文件中,我添加了一个图标。如果我没弄错的话,这个图标不是资源?只有包含它的.resources文件?@pikachu看到了Hans Passant的评论。我不认为Hans Passant所说的是如何澄清我的困惑。我早就知道了。我不应该在以前的问题中提到它。所以,我要编辑它。更新:我不能再编辑了:),但我想你现在明白了。因为这个答案,我的项目得以完成。我在解决方案中添加了一个名为Images的文件夹,并在windows资源管理器中打开该文件夹,然后将我的图像文件复制到Images文件夹中。然后进入visual studio,单击解决方案资源管理器顶部的“显示所有文件”,右键单击“图像”文件夹中的图像文件,然后单击“包含在项目中”。然后我左键单击解决方案资源管理器中的图像文件,并在“属性”窗口中,将构建操作设置为您提到的嵌入式资源;字符串[]picNames=asmb.GetManifestResourceNames();foreach(picNames中的字符串s){if(s.EndsWith(“.png”){Stream strm=asmb.GetManifestResourceStream(s);if(strm!=null){picsStrm.Add(strm);}}资源是否需要。资源扩展?它们不可能是.txt文件等?抱歉@KyleDelaney,我很久以前写过这个答案,现在没有像那时那样特别记得.NET资源/附属程序集的详细信息。你可能想问一个新问题。
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;
}