【发布时间】:2017-11-23 15:18:59
【问题描述】:
我有一个包含很多 ResourceDictionaries 的 .dll。
所有这些 ResourceDictionaries 的 build action 都设置为 "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();
}
}
如果你调用这个方法,你会得到所有以“.baml”结尾的资源字符串,你可以遍历它们。
感谢 Jon Wu 的正确提示。
【问题讨论】:
-
@JohnPeters:不。正如我在问题中明确写的那样,GetManifestResourceNames() 仅适用于“EmbeddedResource”。它不适用于“页面”。
-
所有“页面”标记的项目都将进入
<WpfApplicationName>.g.resources.NET 嵌入式资源,每个字典包含一个流。这些字典采用 BAML 格式 (en.wikipedia.org/wiki/…),所以我不确定这是否有用。枚举完这些 BAML 流后,您想做什么? -
@SimonMourier:我使用“obj = Application.LoadComponent(uri);”将它们加载到 RAM 中。问题是,一旦将它们编译为 EmbeddedResource,如果 ResourceDictionaries 相互引用,这将不再起作用。对于引用,我的意思是使用 Uri-Packs 导入。例如:您有一个样式 RD,它从另一个 RD 导入颜色:
. -
您应该告诉我们您只需要字典 names。我最初的评论首先给出了解决方案
标签: c# wpf resources buildaction