2010-03-25 65 views
11

我有一個資源程序集,其中包含的圖像文件使用資源內容構建動作。這使得這些文件可以使用Uris訪問。但是我找不到列舉這些資源的方法。
如果我設置構建動作嵌入的資源有可能枚舉用下面的代碼文件:在運行時枚舉.NET程序集資源

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

,但它反過來又使這些文件無法訪問使用的URI。

的問題是 - 如何枚舉與任何資源內容生成操作編譯資源?

注意:正如Thomas Levesque指出的那樣,可以通過利用AssemblyAssociatedContentFileAttribute來枚舉這些資源,但它似乎只適用於WPF應用程序程序集,而不適用於類庫。所以問題仍然存在。

回答

24

您可以枚舉決議界定了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(); 
     } 
    } 
+0

這隻有在程序集具有這樣的屬性集時纔有效 - 例如, WPF應用程序會自動設置它,並且僅適用於使用* Content * build動作構建的文件。在ClassLibrary程序集的情況下,不存在這樣的屬性。即使在彙編代碼中,我也找不到枚舉這些資源的方法。 – 2010-03-25 18:35:04

+0

更新中的代碼回答了原始問題,但仍不是通用解決方案:)在類庫的情況下,它列舉了使用* Content *,* Resource *和* Embedded Resource *構建操作構建的所有資源。但在WPF應用程序的情況下,它只枚舉使用* Embedded Resource *構建操作構建的資源。因此,爲了枚舉WPF App中的所有資源,上述兩種方法的組合都是必需的。 – 2010-03-26 10:02:18

+0

可以對這段代碼進行細化以直接從特定文件夾獲取資源,而無需過濾返回值? (說,我有幾個資源文件夾(可以從解決方案資源管理器中看到),其中一個包含圖像,我想要加載。) – ziyuang 2011-10-07 17:14:41