-1

我有一个包含很多 ResourceDictionaries 的 .dll。

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

在 Dll 中,我想找到所有这些 ResourceDictionaries 并对其进行迭代。

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

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

但是 GetManifestResourceNames() 不适用于具有构建操作“页面”的资源。

如何查找或遍历具有构建操作“页面”的所有资源?

解决方案不必是反射。任何其他方式都非常受欢迎。

谢谢!

解决方案:

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

在运行时枚举 .NET 程序集资源

工作代码稍作改动,如下所示:

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();
        }
    }

如果您调用此方法,您将获得最后带有“.baml”的所有资源字符串,您可以对其进行迭代。

感谢 Jon Wu 的正确提示。

4

1 回答 1

2

根据这个答案

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

所以听起来你只需要寻找用 YourAppName.g.resources.

于 2017-06-24T02:01:44.420 回答