2017-06-20 38 views
-1

我有一个带有大量ResourceDictionaries的.dll。WPF C#思考:使用构建操作遍历所有资源“页面”

构建动作所有这些ResourceDictionaries被设置为“Page”

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

如果我设置构建行动“EmbeddedResource”,我可以使用反射:

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

但GetManifestResourceNames()则用于生成操作“页面的”资源工作。

如何找到或迭代所有具有构建操作“页面”的资源?

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

谢谢!

解决方案:

女士们先生们!我必须宣布,本周的人和这个奖金的获得者是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的正确提示。

+0

这是你的答案吗? https://stackoverflow.com/questions/3314140/how-to-read-embedded-resource-text-file –

+0

@JohnPeters:没有。正如我在问题中明确写的,GetManifestResourceNames()只适用于“EmbeddedResource”。它不适用于“页面”。 – Michael

+1

所有“页面”标记的项目都将放入一个包含每个字典一个流的 .g.resources' .NET嵌入式资源。这些字典采用BAML格式(https://en.wikipedia.org/wiki/Extensible_Application_Markup_Language#Technology),所以我不确定这是否有用。一旦你列举了这些BAML流,你想要做什么? –

回答

2

this answer

页(仅限WPF):用来编辑XAML文件到BAML。然后用与Resource相同的技术嵌入baml(即可用作AppName.g.resources)。

所以这听起来像你只需要寻找与YourAppName.g.resources确定的资源。

+0

女装和绅士!我必须宣布,本周的获奖者是Jon Wu先生和Thomas Levesque先生。 Jon Wu给出了正确的提示并通过搜索,我找到了这个解决方案:https://stackoverflow.com/questions/2517407/enumerating-net-assembly-resources-at-runtime。我已经为问题添加了解决方案。谢谢你,吴约翰! – Michael

+0

你得到赏金,但根据规则,我必须等2个小时,然后才能点击奖励按钮。 – Michael