2010-03-25 21 views
11

İçinde görüntü dosyaları bulunan bir kaynak derlemem var, bunlar Kaynak veya İçerik yapı eylemiyle oluşturulmuştur. Bu, bu dosyaları Uris kullanarak erişilebilir hale getirir. Ancak, bu tür kaynakları sıralamanın yolunu bulamıyorum.
Ben Gömülü Kaynakiçin inşa eylemi ayarlarsanız aşağıdaki kodla dosyaları numaralandırması mümkün hale:Çalışma zamanında .NET derleme kaynaklarının numaralandırılması

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

ama sırayla bu dosyaları URI'lerinin kullanarak erişilemez hale getirir.

soru - nasıl Kaynak veya İçerik inşa eylem biriyle derlenmektedir kaynakları numaralandırılamıyor?

NOT: Thomas Levesque'in belirttiği gibi, AssemblyAssociatedContentFileAttribute öğesini kullanarak bu kaynakları sıralamak mümkündür, ancak yalnızca WPF Uygulama derlemeleri için çalışıyor ve sınıf kitaplığı için değil. Yani soru hala açık.

cevap

24

Sen montaj üzerinde tanımlı AssemblyAssociatedContentFile özelliklerini numaralandırabilmesidir: Ayrıca BAML kaynaklarını numaralandırmak için bir yol this page kontrol edebilirsiniz

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

.


UPDATE: aslında yukarıdaki çözüm yalnızca İçerik dosyaları için çalışır. Bu yöntem, tüm kaynak adlarını (BAML kaynakları, görüntüler, vb. Dahil) döndürür:

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

Bu yalnızca montajın böyle özellikleri ayarlanmışsa çalışır - örn. WPF uygulaması, otomatik olarak ve sadece * İçerik * yapı eylemiyle oluşturulan dosyalar için ayarlanmış olacaktır. ClassLibrary derlemesi söz konusu olduğunda böyle bir özellik yoktur. Ve montaj kodu içinde bile, bu kaynakları sıraya koymanın yolunu bulamıyorum. –

+0

Güncelleştirme kodu orijinal soruyu yanıtlıyor, ancak yine de evrensel bir çözüm değil :) Sınıf kütüphanesi olması durumunda * İçerik *, * Kaynak * ve * Gömülü Kaynak * oluşturma eylemiyle oluşturulan tüm kaynakları sıralar. Ancak WPF Uygulaması durumunda, yalnızca * Gömülü Kaynak * oluşturma eylemiyle oluşturulmuş kaynakları sıralar. Öyle görünüyor ki, WPF App içindeki tüm kaynakları sıralamak için yukarıdaki yöntemlerin her ikisinin kombinasyonu gereklidir. –

+0

Bu kod parçası, dönüş değerini filtrelemeye gerek olmadan, belirli bir klasörden doğrudan kaynak almak için geliştirilebilir mi? (Diyelim ki, birkaç kaynak klasörüm var (çözüm gezgininden görülebilir) ve bunlardan biri yüklemek istediğim görüntüleri içeriyor.) – ziyuang

İlgili konular