WPF C#反思:使用构建操作迭代所有资源" Page"

时间:2017-06-20 22:19:26

标签: c# wpf resources buildaction

我有一个带有很多ResourceDictionaries的.dll。

所有这些ResourceDictionaries的构建操作都设置为" Page"

在Dll中,我想找到所有这些ResourceDictionaries并迭代它们。

如果我将构建操作设置为" EmbeddedResource",我可以使用反射:

var embeddedResources = Assembly.GetExecutingAssembly().GetManifestResourceNames().ToList();

但GetManifestResourceNames()使用构建操作" Page"

执行 工作。

如何查找或迭代所有具有构建操作的资源"页面"?

解决方案不一定是反思。任何其他方式都非常受欢迎。

谢谢!

解决方案:

女士们,先生们!我必须宣布,本周的男人和这个赏金的获胜者是Jon Wu先生。 Jon Wu给出了正确的提示,通过搜索,我找到了这个解决方案:

Enumerating .NET assembly resources at runtime

稍微改变的工作代码如下所示:

public static string[] GetResourceNames()
    {
        var asm = Assembly.GetExecutingAssembly();
        string resName = asm.GetName().Name + ".g.resources";
        using (var stream = asm.GetManifestResourceStream(resName))
        using (var reader = new System.Resources.ResourceReader(stream))
        {
            return reader.Cast<DictionaryEntry>().Select(entry => (string)entry.Key).ToArray();
        }
    }

如果你调用这个方法,你得到的所有资源字符串都包含&#34; .baml&#34;最后你可以迭代它们。

感谢Jon Wu的正确提示。

1 个答案:

答案 0 :(得分:2)

根据this answer

  

页面(仅限WPF):用于将xaml文件编译为baml。然后使用与Resource相同的技术嵌入baml(即可用作AppName.g.resources)。

因此,您只需要查找使用YourAppName.g.resources标识的资源。