2010-03-25 15 views
11

मेरे पास छवि फ़ाइलों के साथ संसाधन असेंबली है जो संसाधन या सामग्री निर्माण कार्य का उपयोग करके बनाई गई है। यह इन फ़ाइलों को उरिस का उपयोग करके सुलभ बनाता है। हालांकि मुझे ऐसे संसाधनों का आकलन करने का तरीका नहीं मिल रहा है।
अगर मैं एंबेडेड संसाधनके निर्माण कार्रवाई सेट यह निम्न कोड के साथ फ़ाइलों की गणना करने में संभव हो जाता है:रनटाइम पर .NET असेंबली संसाधनों का आकलन

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

लेकिन यह बदले में इन फ़ाइलों Uris का उपयोग कर दुर्गम बना देता है।

सवाल है - कैसे संसाधनों है कि या तो संसाधन या सामग्री निर्माण कार्रवाई के साथ संकलित किया गया है की गणना करने में?

नोट: थॉमस लेवेस्क ने बताया कि असेंबलीएसिओटेड कॉन्टेंटफाइलएट्रिब्यूट का लाभ उठाकर ऐसे संसाधनों को गिनना संभव है, लेकिन ऐसा लगता है कि केवल डब्ल्यूपीएफ एप्लीकेशन असेंबली के लिए काम करता है, न कि क्लास लाइब्रेरी के लिए। तो सवाल अभी भी खुला है।

उत्तर

24

आप AssemblyAssociatedContentFile विशेषताओं विधानसभा पर परिभाषित की गणना कर सकते हैं:

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

तुम भी एक तरह से BAML संसाधनों की गणना करने के लिए this page देख सकते हैं।


अद्यतन: वास्तव में उपरोक्त समाधान केवल सामग्री फ़ाइलों के लिए काम करता है। विधि बेलो सभी संसाधन नाम (बीएएमएल संसाधन, छवियों, आदि सहित) लौटाता है:

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 एप्लिकेशन यह स्वचालित रूप से सेट हो जाएगा और केवल * सामग्री * निर्माण कार्रवाई के साथ बनाई गई फ़ाइलों के लिए। क्लास लाइब्रेरी असेंबली के मामले में ऐसी कोई विशेषताएं नहीं हैं। और असेंबली कोड के भीतर भी मुझे ऐसे संसाधनों का आकलन करने का तरीका नहीं मिल रहा है। –

+0

अद्यतन में कोड मूल प्रश्न का उत्तर देता है, लेकिन फिर भी एक सार्वभौमिक समाधान नहीं है :) कक्षा पुस्तकालय के मामले में - यह * सामग्री *, * संसाधन * और * एम्बेडेड संसाधन * निर्माण कार्य के साथ बनाए गए सभी संसाधनों का आकलन करता है। लेकिन डब्ल्यूपीएफ एप्लीकेशन के मामले में यह केवल * एंबेडेड रिसोर्स * बिल्ड एक्शन के साथ बनाए गए संसाधनों का आंकलन करता है। तो ऐसा लगता है कि डब्ल्यूपीएफ ऐप में सभी संसाधनों का आकलन करने के लिए उपरोक्त दोनों विधियों का संयोजन आवश्यक है। –

+0

क्या इस टुकड़े को वापसी मूल्य को फ़िल्टर करने की आवश्यकता के बिना सीधे किसी विशेष फ़ोल्डर से संसाधन प्राप्त करने के लिए परिष्कृत किया जा सकता है? (कहें, मेरे पास कई संसाधन फ़ोल्डर्स हैं (समाधान एक्सप्लोरर से देखा जा सकता है), और उनमें से एक में छवियां हैं, जिन्हें मैं लोड करना चाहता हूं।) – ziyuang

संबंधित मुद्दे