我有一个包含图像文件的资源程序集,它使用 Resource 或 Content 构建操作构建。这使得可以使用Uris访问这些文件。但是我找不到列举这些资源的方法 如果我将构建操作设置为嵌入式资源,则可以使用以下代码枚举文件:
string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames();
但它反过来使用Uris无法访问这些文件。
问题是 - 如何枚举使用资源或内容构建操作编译的资源?
注意:正如Thomas Levesque指出的那样,可以通过利用AssemblyAssociatedContentFileAttribute来枚举这些资源,但它似乎只适用于WPF应用程序集,而不适用于类库。所以问题仍然存在。
答案 0 :(得分:27)
您可以枚举程序集中定义的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();
}
}