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

Ale*_*x_P 12 .net wpf resources

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

string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames();
Run Code Online (Sandbox Code Playgroud)

但它反过来使用Uris使这些文件无法访问.

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

注意:正如Thomas Levesque所指出的,可以通过利用AssemblyAssociatedContentFileAttribute来枚举这些资源,但它似乎只适用于WPF应用程序集,而不适用于类库.所以问题仍然存在.

Tho*_*que 28

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

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

您还可以查看此页面以获取枚举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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • @ToolmakerSteve,上面的代码用于WPF资源,而不是标准的.NET嵌入式资源.对于嵌入式资源,GetManifestResourceNames确实是要走的路. (2认同)