C#Assembly.GetManifestResourceNames()不返回资源名称

时间:2014-10-06 16:37:38

标签: c# .net resources

也许我误解了Assembly.GetManifestResourceNames()的含义。我想浏览我的应用程序资源,这就是我正在做的事情:

    foreach (string res in System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames())
    {
        Console.WriteLine(res);
    }

我的应用程序有几个图像资源,我希望上面的代码列出它们的名称。相反,我得到的就是这个输出:

  • G19SysMon.frmMain.resources
  • G19SysMon.frmSetup.resources
  • G19SysMon.Properties.Resources.resources

我出错了什么?

3 个答案:

答案 0 :(得分:6)

  

我的应用程序有多个图像资源

确实如此,但它们存储在.resx文件中。像frmMain.resx。该文件被转换为" blob",一块二进制数据。它由Resgen.exe生成,具有.resources文件扩展名。并且 blob被添加为清单资源。你会看到带有代码的.resources blob。

在blob中找回原始资源是ResourceReader类的工作。您可以在for-each循环中使用它来枚举原始资源。但是您通常使用ResourceManager类,这是ResourceReader之上的额外层。它支持本地化,从卫星文件中读取资源。 Winforms使用ComponentResourceManager,一个派生类,并自动调用ApplyResources()。您可以在InitializeComponent()方法中看到这一点。

答案 1 :(得分:0)

使用ildasm(http://msdn.microsoft.com/en-us/library/f7dy01k1%28v=vs.110%29.aspx)打开程序集dll。这将显示清单中的资源名称。如果你想获得不同的名字,那么GetManifestResourceNames()就不是你想要的了

答案 2 :(得分:0)

@HansPassant:谢谢你的完美答复。

此代码:

    ResourceSet resSet = Properties.Resources.ResourceManager.GetResourceSet(Thread.CurrentThread.CurrentCulture, false, true);
    foreach (DictionaryEntry entry in resSet)
    {
        if (entry.Value is Image))
        {
            // Use the image
        }
    }

完全符合我的需要。