C#程序集.GetManifestResourceNames()不返回资源名称

本文关键字:返回 资源 程序集 GetManifestResourceNames | 更新日期: 2023-09-27 18:25:40

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

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

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

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

我做错了什么?

C#程序集.GetManifestResourceNames()不返回资源名称

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

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

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

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

@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
        }
    }

做我需要的事。