2013-12-11 11 views
6

तक पहुंचने के लिए प्रतिबिंब बनाम मुझे कुछ बहुत आसान याद आ रहा है, लेकिन से एक एम्बेडेड संसाधन पुनर्प्राप्त करने के लिए प्रतिबिंब का उपयोग करने का क्या फायदा है जिसमें संसाधन है बस इसे एक .resx फ़ाइल के माध्यम से पुनर्प्राप्त कर रहा है? मैं इसे बहुत कुछ देखता हूं लेकिन इसे प्राप्त नहीं करता - क्या resx फ़ाइल Resources.resource की तुलना में Assembly.GetExecutingAssembly().GetManifestResourceStream(resource) का उपयोग करने का कोई कारण है? यहां तक ​​कि माइक्रोसॉफ्ट भी करता है: How to embed and access resourcesसंसाधन फ़ाइल (.resx) बनाम एक एम्बेडेड संसाधन

मेरा क्या मतलब है: मान लें कि मेरे पास एक असेंबली MyAssembly है जिसमें एक एम्बेडेड संसाधन Config.xml है।

public string GetConfigXML() 
{ 
    Stream xmlStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyAssembly.Config.xml"); 
    string xml = GetStringFromStream(xmlStream); 
    return xml; 
} 

क्यों GetManifestResourceStream() जब का उपयोग करें:

public string GetConfigXML() // returns the content of Config.xml as a string 

अक्सर, मैं संसाधन पुनः प्राप्त करने के प्रतिबिंब का उपयोग कर इस इस तरह लागू किया देखते हैं,: विधानसभा MyClass है कि एक विधि है कि एक स्ट्रिंग के रूप कहा संसाधन रिटर्न लागू करता है आप कर सकते हैं:

  1. दृश्य स्टूडियो में MyAssembly परियोजना के लिए संसाधन फ़ाइल (Resource.resx) जोड़ने;
  2. संसाधन की 'फ़ाइलें' में Config.xml जोड़ें;
  3. एक बहुत सरल तरीके से Config.xml की सामग्री मिलती है: string xml = Resource.Config;

मैं नहीं जानता कि कैसे दृश्य स्टूडियो .resx आंतरिक रूप से हैंडल फ़ाइलें, लेकिन मैं इसे बस प्रतियां .resx फ़ाइल में संसाधन शक (में जो मामला आप डुप्लिकेट संसाधनों के साथ समाप्त होगा)। मुझे लगता है कि यह आंतरिक रूप से प्रतिबिंब का उपयोग नहीं करता है, तो इस तरह की स्थितियों में बस .resx फ़ाइलों का उपयोग क्यों न करें, जो मेरे लिए अधिक प्रदर्शन-अनुकूल लगता है?

+1

इसे असेंबली के माध्यम से प्राप्त करना * आपके लिए संस्कृति जागरूक उपग्रह असेंबली लोडिंग कर सकता है, जबकि रेक्स लोड करना आपको वर्तमान संस्कृति के लिए सही चुनने की ज़िम्मेदारी के साथ छोड़ देगा। –

उत्तर

3

लेकिन प्रतिबिंब का उपयोग कर एक एम्बेडेड संसाधन

आम लाभ किसी भी कारण से एक प्रारूप से दूसरे में परिवर्तित करने के लिए डेटा के पीछे है कि पुन: प्राप्त करने का क्या लाभ है। गति, गति, गति और सुविधा।

एक्सएमएल आपके संसाधनों को संग्रहीत रखने के लिए एक सुंदर सभ्य प्रारूप है। आपको बहुत अच्छी गारंटी होगी कि अब भी आप मूल संसाधन को 10 साल से पुनर्प्राप्त कर सकते हैं जब मूल समय के धुंध में खो गया है और एक जोड़ा अच्छे बैकअप के बिना मशीन में बदलाव। लेकिन यह पढ़ने के लिए काफी चूसने वाला प्रारूप है, एक्सएमएल बहुत वर्बोज़ है और एक टुकड़े को ढूंढने के लिए फ़ाइल की शुरुआत से पढ़ने की आवश्यकता है।

समस्याएं जो गायब हो जाती हैं जब Resgen.exe .xml फ़ाइल को .resource फ़ाइल में संकलित करता है। एक बाइनरी प्रारूप जो आपके असेंबली मेटाडेटा में लिंक होने के लिए उपयुक्त है और संसाधन में मूल बाइट्स शामिल है। और आपकी असेंबली लोड होने पर सीधे स्मृति में मैप किया जाता है, किसी अन्य फ़ाइल को खोजने और इसे खोलने की आवश्यकता नहीं होती है, इसे पढ़ती है और डेटा को परिवर्तित करती है। बड़ा अंतर।

सीधे GetManifestResourceStream() का उपयोग करने से बचने के लिए संसाधन डिज़ाइनर का उपयोग करें। फिर भी अधिक सुविधा।

+0

उचित अंक, धन्यवाद।ऐसा लगता है कि, हालांकि, प्रत्यक्ष संसाधन पहुंच के लिए प्रतिबिंब का उपयोग करने का गति लाभ केवल तभी स्पष्ट हो जाएगा जब आप .resx में बड़ी मात्रा में संसाधन फ़ाइलों को संग्रहीत कर रहे हों, जबकि एम्बेडेड संसाधन प्रतिबिंब की एक छोटी संख्या वास्तव में होगी धीमे (क्योंकि आपको 'GetManifestResourceStream' की आवश्यकता है और फिर इसे उचित प्रारूप में परिवर्तित करें) .resx से पढ़ने की तुलना में? – w128

+4

आप सामान्य मिथक से परिचालन कर रहे हैं कि "प्रतिबिंब धीमा है"। जब आप एक संपत्ति मूल्य प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सीधे संपत्ति बनाते हैं, तो यह केवल धीमा होता है। निश्चित रूप से, आप प्रतिबिंब के साथ एक नैनोसेकंद को हरा नहीं सकते हैं। GetManifestResourceStream फ़ाइल खोलने की तुलना में * धीमी * धीमी नहीं है। यह आसानी से 50,000x तेज है, आयाम का आदेश दें या ले लो :) –

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