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

16

我有一个资源程序集,其中包含使用ResourceContent构建操作构建的图像文件。这使得可以使用Uri访问这些文件。然而,我找不到枚举此类资源的方法。
如果我将构建操作设置为Embedded Resource,则可以使用以下代码枚举文件:

string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames();
但是这反过来又使这些文件使用URI不可访问。问题是:如何枚举使用“Resource”或“Content”构建操作编译的资源?请注意:正如Thomas Levesque指出的那样,可以通过利用AssemblyAssociatedContentFileAttribute枚举此类资源,但似乎仅适用于WPF应用程序集,而不适用于类库。因此,问题仍然存在。
1个回答

33
你可以枚举在程序集上定义的 AssemblyAssociatedContentFile 属性:
var resourceUris = Assembly.GetEntryAssembly()
                   .GetCustomAttributes(typeof(AssemblyAssociatedContentFileAttribute), true)
                   .Cast<AssemblyAssociatedContentFileAttribute>()
                   .Select(attr => new Uri(attr.RelativeContentFilePath));

您也可以查看此页面,了解枚举BAML资源的方法。


更新:实际上上面的解决方案仅适用于Content文件。下面的方法返回所有资源名称(包括BAML资源、图像等):

    public static string[] GetResourceNames()
    {
        var asm = Assembly.GetEntryAssembly();
        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();
        }
    }

这只适用于已设置了这些属性的程序集 - 例如,WPF应用程序会自动设置它,并且仅适用于使用Content构建操作生成的文件。对于ClassLibrary程序集,没有这样的属性。而且,即使在程序集代码中,我也找不到枚举此类资源的方法。 - Alex_P
update中的代码回答了原始问题,但仍不是通用解决方案 :) 对于类库 - 它枚举使用ContentResourceEmbedded Resource构建操作构建的所有资源。但对于WPF应用程序,它只枚举使用Embedded Resource构建操作构建的资源。因此,似乎需要结合上述两种方法才能枚举WPF App中的所有资源。 - Alex_P
FYI,对于VB类库,以上两种方法都不适用于我 - 尝试了GetEntryAssembly()和GetExecutingAssembly()来获取asm。可行的方法是Assembly.GetExecutingAssembly().GetManifestResourceNames(),感谢https://dev59.com/HGgu5IYBdhLWcg3wWl8q#11377846。 - ToolmakerSteve
2
@ToolmakerSteve,上面的代码是针对WPF资源的,而不是标准.NET嵌入式资源。对于嵌入式资源,GetManifestResourceNames确实是正确的方法。 - Thomas Levesque
太棒了,Thomas!我也遇到了同样的问题:https://stackoverflow.com/questions/44663908/wpf-c-sharp-reflection-iterate-over-all-resources-with-build-action-page。我稍微修改了你的代码,并在我的问题中链接了你的答案。 - Michael
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接