2014-05-11 7 views
6

मैं एक प्रोजेक्ट पर काम कर रहा हूं जहां मैं संसाधन प्रबंधक का व्यापक रूप से उपयोग कर रहा हूं और यह प्रश्न सिर्फ मेरे दिमाग को पार कर गया है। क्या हम ResourceManager का उपयोग किये बिना .resx फ़ाइलों से पढ़ सकते हैं? मेरा मतलब है, क्या कोई और तरीका है?क्या हम संसाधन प्रबंधक को छोड़ सकते हैं?

+2

आप इसमें रुचि क्यों रखते हैं? – poke

+3

'.resx' फ़ाइलें केवल एक्सएमएल फाइलें हैं ... और किसी भी अन्य एक्सएमएल फ़ाइल की तरह, यदि आप ऐसा करने की आवश्यकता महसूस करते हैं, तो आप उन '.resx' फ़ाइलों को आसानी से पढ़ और पार्स कर सकते हैं ..... –

+0

मेरी जिज्ञासा। –

उत्तर

1

रेफरी माइक्रोसॉफ्ट: एक संसाधन प्रबंधक का प्रतिनिधित्व करता है जो रन-टाइम पर संस्कृति-विशिष्ट संसाधनों तक सुविधाजनक पहुंच प्रदान करता है।

मुझे उम्मीद है कि, आप बहु लैंग का उपयोग करेंगे, आपको एक अधिक लगातार परिणाम और बेहतर संगतता मिलेगी।

आईएमएचओ

2

अच्छा, संसाधन असेंबली में संकलित किए गए हैं। आप बाइट्स (या आईएल) पढ़कर असेंबली को पढ़ने की कोशिश कर सकते हैं, और वहां से संसाधन निकालेंगे।

संसाधन प्रबंधक यह सब आपके लिए करता है, इसलिए मैं ऐसा करने के किसी भी कारण से नहीं सोच सकता ... शायद एक, अगर आप स्मृति में असेंबली लोड नहीं करना चाहते हैं, तो आप संसाधन प्रबंधक के बिना ऐसा कर सकते हैं।

6

यदि आप ResourceManager के उपयोग को छोड़ना चुनते हैं तो आप विजुअल स्टूडियो हैंडल कोड पीढ़ी को आपके लिए छोड़ सकते हैं। आखिरकार जेनरेट कोड ResourceManager का उपयोग करता है, लेकिन अब आप उस कोड को मैन्युअल रूप से लिख नहीं रहे हैं। इसके अतिरिक्त, आप संकलित-समय की जांच प्राप्त करते हैं क्योंकि आप जेनरेट की गई स्थिर कक्षा का संदर्भ दे रहे हैं।

यदि आप अपनी प्रोजेक्ट में संसाधन फ़ाइल जोड़ते हैं और इसे सॉल्यूशन एक्सप्लोरर से डबल क्लिक करते हैं, तो विजुअल स्टूडियो आपको एक संवाद के साथ प्रस्तुत करता है जहां आप संसाधन के लिए नाम दर्ज कर सकते हैं, और इसका मूल्य। संवाद आपको तारों, छवियों, ऑडियो इत्यादि के रूप में संसाधन जोड़ने के विकल्पों के साथ प्रस्तुत करता है (संवाद के शीर्ष पर ड्रॉपडाउन देखें)। इसके बाद, कोड जनरेशन बिट प्राप्त करने के लिए, आपको Access Modifier को "सार्वजनिक" या "आंतरिक" पर सेट करने की आवश्यकता है। तीसरा विकल्प "कोई कोड पीढ़ी नहीं है।"

उदाहरण के लिए, एक संसाधन "MyResources" कहा जाता है फ़ाइल जोड़ने तो नामGreeting और Hello! के मूल्य पूर्व दो विकल्प कोड पीढ़ी के लिए चुना में से एक के साथ साथ एक स्ट्रिंग संसाधन जोड़ने (सार्वजनिक के साथ शुरू इसका परीक्षण करने के लिए, आवश्यकतानुसार पहुंच प्रतिबंधित करें), अब आप MyResources.Greeting के माध्यम से अपने कोड से संसाधनों का संदर्भ ले सकते हैं। यदि आप इसे तुरंत नहीं देखते हैं, तो सुनिश्चित करें कि आपने फ़ाइल को सहेज लिया है और संकलन करने का प्रयास किया है।

string greeting = MyResources.Greeting; // "Hello!" 

यदि आप अन्य संसाधन प्रकार (छवि, ऑडियो इत्यादि) जोड़ते हैं तो वापसी प्रकार अलग-अलग होंगे।

इस बिंदु पर आप उत्पन्न .cs फ़ाइल का निरीक्षण कर सकते हैं और देख सकते हैं कि जेनरेट कोड ResourceManager का उपयोग कर रहा है। संसाधन फ़ाइलों के लिए अन्य उपयोग स्थानीयकरण है। मान लें कि आप MyResources का स्पेनिश संस्करण चाहते थे। आप MyResources.es.resx नामक एक नई फ़ाइल जोड़ देंगे, जहां es वांछित भाषा कोड (इस मामले में स्पेनिश) से मेल खाता है। Hola! के स्पेनिश मूल्य के साथ अब Greeting का एक ही संसाधन नाम जोड़ें।

आप स्पेनिश धागा संस्कृति बदलते हैं, तो संसाधन संदर्भित अब स्पैनिश संस्करण वापस आ जाएगी:

string defaultGreeting = MyResources.Greeting; // "Hello!" 
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("es"); 
string spanishGreeting = MyResources.Greeting; // "Hola!" 

नोट है कि आप केवल वास्तव में के लिए कोड पीढ़ी विकल्पों में से एक के लिए उपयोग संशोधक निर्धारित करने की आवश्यकता आपके डिफ़ॉल्ट संसाधन फ़ाइल (यानी, MyResources.resx), आपके द्वारा जोड़े गए अन्य सभी स्थानीय संस्करणों के लिए नहीं।ऐसा करने में कोई हानि नहीं है, लेकिन मेरी राय में यह मुख्य फ़ाइल उत्पन्न करने के लिए क्लीनर है जबकि अन्य लोगों के पास कोड जनरेशन के बिना वांछित संसाधन मान हैं।

+0

देखें [यह उत्तर] (http://stackoverflow.com/a/ 41508977/1497596) 'संसाधन' फ़ोल्डर में अपनी संसाधन फ़ाइलों को कैसे स्थानांतरित करें और फिर उन्हें 'YourProject.Properties' नामस्थान के माध्यम से एक्सेस करें। (ध्यान दें कि गुण => संसाधनों के माध्यम से, विजुअल स्टूडियो आपको 'एकल संसाधन फ़ाइल] (http://stackoverflow.com/a/90699/1497596) श्रेणी' YourProject.Properties.Resources 'के माध्यम से पहुंच प्रदान करेगा।) – DavidRR

16

ResourceManager एक सुविधा वर्ग है, यह बिल्ड सिस्टम .resx फ़ाइलों का समर्थन करने के तरीके से बहुत अच्छी तरह से काम करता है। नहीं, यह सख्त आवश्यकता नहीं है।

एक .NET असेंबली में असेंबली के प्रकट होने में मनमाने ढंग से डेटा एम्बेड करने की सामान्य क्षमता है। बाइट्स का सिर्फ एक ब्लॉब, यह कुछ भी हो सकता है जो आप चाहते हैं। सीधे सिस्टम सिस्टम द्वारा समर्थित है, बस अपनी प्रोजेक्ट में एक फ़ाइल जोड़ें और अपनी बिल्ड एक्शन को "एंबेडेड रिसोर्स" पर सेट करें। रनटाइम पर, आप उस फ़ाइल में डेटा को Assembly.GetManifestResourceStream() से पुनर्प्राप्त करते हैं।

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

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

आप नहीं करना चाहते हैं .resources डेटा स्वयं को पढ़ना है। आप एक सहायक वर्ग का उपयोग करना चाहेंगे जो बाइट्स के ब्लॉब से विशिष्ट संसाधनों को वापस पा सके। आप ResourceReader class का उपयोग करना चाहते हैं, इसकी GetResourceData() आपको संसाधन का नाम निर्दिष्ट करने देती है और यह संसाधन प्रकार और डेटा को वापस थूक देगी।

आप वहां पर रोक सकते हैं, लेकिन एक ऐप को अक्सर संसाधनों के विभिन्न सेटों की आवश्यकता होती है। एक बहुत ही आम स्थानीयकरण की जरूरत है। उपग्रह असेंबली क्या हैं, विभिन्न असेंबली जिनमें संसाधनों के अलावा कुछ भी नहीं है, प्रत्येक एक विशिष्ट संस्कृति के लिए है। वे अलग हैं इसलिए आप वर्चुअल मेमोरी के लिए भुगतान नहीं करते हैं, जिन्हें सभी स्थानीयकृत संसाधनों को संग्रहीत करने की आवश्यकता होती है जब आपको उनमें से केवल एक सेट की आवश्यकता होती है। यहां एक सहायक वर्ग है जो वर्तमान संस्कृति के आधार पर स्वचालित उपग्रह असेंबली को स्वचालित रूप से ढूंढता है और लोड करता है और आपके लिए संसाधन पुनर्प्राप्त करता है।

वह सहायक वर्ग ResourceManager है।

+0

अच्छी प्रतिक्रिया! मैंने अभी तक 'resgen' का उपयोग करने की आवश्यकता के रूप में उद्यम नहीं किया है। मैं स्ट्रिंग संसाधनों के सख्ती से सख्ती से कुछ हल्का स्थानीयकरण कार्य कर रहा हूं, लेकिन मैं देख सकता हूं कि यह मेरी अगली कदम कैसे होगी, अन्य संसाधन प्रकारों को शामिल करने के लिए मेरी जरूरतों को विस्तारित करना चाहिए। –

+0

@ हंस वास्तव में एक बहुत ही जोरदार प्रतिक्रिया। मैंने बाइनरी "रैपिंग" के आसपास कुछ सीखा। धन्यवाद। –

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