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
我做错了什么?
我的应用程序有几个图像资源
确实如此,但它们存储在.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
}
}
做我需要的事。