C# 如何获取特定文件夹中的嵌入资源或区分不同文件夹中的嵌入资源

10
标题已经很清楚地概括了。我知道可以使用以下方式获取嵌入式资源名称:
        var assembly = System.Reflection.Assembly.GetExecutingAssembly();
        string[] files = assembly.GetManifestResourceNames();

但我希望只能从特定文件夹获取嵌入式资源。或者至少能够区分来自不同文件夹的嵌入式资源。

2个回答

14

资源以以下格式返回。

[Namespace].[Folder].[Filename]

请注意,路径中的所有文件夹都是由 . 分隔的。因此,如果您有以下配置的嵌入式资源:

myproject.csproj(命名空间 = com.mycompany.myproject)
- Resources
  - Images
    - Icons
      - my_icon.ico

资源名称将是...

com.mycompany.myproject.Resources.Images.Icons.my_icon.ico
com.mycompany.myproject.Resources.Images.Icons.my_icon.ico

如果你想从特定文件夹中选择所有内容,你可以使用下面的LINQ表达式或根据需要修改它。

string prefix = "your_namespace.your_folder."

var resourceNames = Assembly.GetExecutingAssembly()
    .GetManifestResourceNames()
    .Where(name => name.StartsWith(prefix));

这段代码会抛出一个错误,因为它无法将IEnumerable转换为字符串。此外,它还没有考虑到同一文件夹下有多个文件的情况。 - Flavia
哎呀,我把那段代码从另一个项目中复制粘贴过来时忘记修改类型了。现在我已经纠正了它。 - Timothy Schoonover
1
这个程序可以找到文件夹中包括子文件夹中的所有文件!此外,如果你嵌入了文件 Res/my.special.file.txt 并且你搜索 Res/my/ 中的所有文件,它也会被返回。 - Jack Miller
需要注意的是,如果您的文件夹名称中有连字符,它会被“转换”为下划线作为资源名称。在使用GetManifestResourceNames之前,我一直在努力解决问题,但现在终于得以解脱了。 - Broots Waymb
这给了我一个错误: 无法将“System.Collections.Generic.IEnumerable<string>”转换为“System.Reflection.Assembly”。 - user2328273

4
如果您创建一个名为Images的文件夹,并将文件放置在其中,则资源的名称变为Assembly.Images.fileName。
因此,您可以尝试以下内容:
var assembly = System.Reflection.Assembly.GetExecutingAssembly();

var names = assembly.GetManifestResourceNames().Where (n => n.Contains(".Images."));

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