我一直在学习C#和visual C#IDE中的资源。我现在很困惑。我已经阅读了StackOverflow上的一些页面,比如这个如何获取一个嵌入式资源的路径和微软的文档,但它让我很困惑。
我的第一个问题:什么是资源:是.resources文件还是其中的文件,如图标。
第二:当我使用GetManifestResourceNames方法时:我是否获得.resources文件名或其中的文件名。当我在我的程序中使用它时,我只获取.resources文件,但是阅读像这样循环遍历所有资源的resx文件的主题,我得到的印象我应该得到的名称.resources文件中的文件。
是我,还是这个术语真的有点令人困惑?任何人都可以让它更清晰一点吗?感谢您的帮助。
答案 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;
}