【问题标题】:Enumerating .NET assembly resources at runtime在运行时枚举 .NET 程序集资源
【发布时间】:2010-03-25 16:34:12
【问题描述】:

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

string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames();

但这反过来又使这些文件无法使用 Uris 访问。

问题是 - 如何枚举使用 ResourceContent 构建操作编译的资源?

注意:正如 Thomas Levesque 所指出的,可以通过利用 AssemblyAssociatedContentFileAttribute 枚举此类资源,但它似乎仅适用于 WPF 应用程序程序集,不适用于类库程序集。所以这个问题仍然悬而未决。

【问题讨论】:

    标签: .net wpf resources


    【解决方案1】:

    您可以枚举在程序集上定义的AssemblyAssociatedContentFile 属性:

    var resourceUris = Assembly.GetEntryAssembly()
                       .GetCustomAttributes(typeof(AssemblyAssociatedContentFileAttribute), true)
                       .Cast<AssemblyAssociatedContentFileAttribute>()
                       .Select(attr => new Uri(attr.RelativeContentFilePath));
    

    您还可以查看this page 了解枚举 BAML 资源的方法。


    更新:实际上上述解决方案仅适用于内容文件。以下方法返回所有资源名称(包括 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 程序集,则没有此类属性。甚至在汇编代码中我也找不到枚举这些资源的方法。
    • 更新中的代码回答了原始问题,但仍然不是通用解决方案 :) 对于类库 - 它枚举使用 Content 构建的所有资源,Resource 和 Embedded Resource 构建操作。但在 WPF 应用程序的情况下,它仅枚举使用 Embedded Resource 构建操作构建的资源。所以看来,为了枚举WPF App中的所有资源,需要结合以上两种方法。
    • 这段代码能否提炼成直接从特定文件夹获取资源,而不需要过滤返回值? (比如说,我有几个资源文件夹(可以从解决方案资源管理器中看到),其中一个包含我要加载的图像。)
    • @ziyuang,不,此解决方案不允许您指定资源的路径。但是使用 LINQ 过滤结果非常容易......
    • @ToolmakerSteve,上面的代码适用于 WPF 资源,而不适用于标准的 .NET 嵌入式资源。对于嵌入式资源,GetManifestResourceNames 确实是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多