WPF C# 反射:使用构建操作迭代所有资源 "Page"
WPF C# Reflection: Iterate over all resources with build action "Page"
我有一个包含很多 ResourceDictionaries 的 .dll。
所有这些 ResourceDictionaries 的 build 操作 设置为 "Page".
在 Dll 中,我想找到所有这些 ResourceDictionaries 并迭代它们。
如果我将构建操作设置为 "EmbeddedResource",我可以使用反射:
var embeddedResources = Assembly.GetExecutingAssembly().GetManifestResourceNames().ToList();
但是 GetManifestResourceNames() 不 为具有构建操作的资源工作 "Page"。
如何查找或遍历具有构建操作 "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();
}
}
如果您调用此方法,您将获得所有以“.baml”结尾的资源字符串,您可以对其进行迭代。
感谢 Jon Wu 的正确提示。
根据this answer,
Page (WPF only): Used to compile a xaml file into baml. The baml is then embedded with the same technique as Resource (i.e. available as AppName.g.resources
).
所以听起来您只需要查找用 YourAppName.g.resources
标识的资源。
我有一个包含很多 ResourceDictionaries 的 .dll。
所有这些 ResourceDictionaries 的 build 操作 设置为 "Page".
在 Dll 中,我想找到所有这些 ResourceDictionaries 并迭代它们。
如果我将构建操作设置为 "EmbeddedResource",我可以使用反射:
var embeddedResources = Assembly.GetExecutingAssembly().GetManifestResourceNames().ToList();
但是 GetManifestResourceNames() 不 为具有构建操作的资源工作 "Page"。
如何查找或遍历具有构建操作 "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();
}
}
如果您调用此方法,您将获得所有以“.baml”结尾的资源字符串,您可以对其进行迭代。
感谢 Jon Wu 的正确提示。
根据this answer,
Page (WPF only): Used to compile a xaml file into baml. The baml is then embedded with the same technique as Resource (i.e. available as
AppName.g.resources
).
所以听起来您只需要查找用 YourAppName.g.resources
标识的资源。