रिफ्लेक्टर इतनी आवश्यक उपयोगिता क्यों है?


10

रिफ्लेक्टर के आसपास जाने वाले ब्रूहा को पढ़ने से मुझे उत्पाद और इसके उपयोग के बारे में सोचने का मौका मिला। कई लोग इसे एक आवश्यक उपकरण मानते हैं।

मुझे स्वीकार करना होगा, मैंने वर्षों में रिफलेक्टर का उपयोग नहीं किया है। मेरा मतलब है, .Net एपीआई और मेरे द्वारा उपयोग किए जाने वाले तीसरे पक्ष के घटकों के लिए प्रलेखन है। अतीत में, जब भी किसी सहकर्मी ने रिफ्लेक्टर को अपने टूल बेल्ट से बाहर निकाला, मुझे समझ में आया कि वह मातम में था।

रिफ्लेक्टर के चारों ओर सभी जुनून को पढ़ना मुझे सवाल करने के लिए प्रेरित कर रहा है कि क्या मैं वास्तव में यहां कुछ याद कर रहा हूं। आपको रिफ्लेक्टर जैसी चीज़ की इतनी बार आवश्यकता क्यों है कि आप इसे एक आवश्यक उपकरण मानते हैं? मैं इसे बहुत ही दुर्लभ अवसरों पर देख सकता हूं, लेकिन इतना जरूरी नहीं कि इसे एक आवश्यक उपकरण माना जाए। कृपया मुझे ज्ञान दो।


मुझे यह कहते हुए खुशी हो रही है कि इस दिन और उम्र में, रिफ्लेक्टर अब ऐसी आवश्यक उपयोगिता नहीं है (जब तक कि आप .NET के पुराने संस्करणों का उपयोग नहीं कर रहे हैं)। अब आप .NET संदर्भ स्रोत पर जा सकते हैं और CLR के आंतरिक कामकाज को देख सकते हैं , टिप्पणियों और सभी को मनोरंजक बना सकते हैं। उदाहरण के लिए, यहाँ StringBuilder.Length विधि के बारे में मैंने नीचे अपने जवाब में बात की है। यदि आप अधिक से अधिक लंबाई असाइन करते हैं, तो आप 487 पंक्ति में देख सकते हैं कि यह रिक्त वर्णों को कैसे जोड़ता है, रिक्त स्थान को नहीं।
11

जवाबों:


8

यहाँ प्रश्न के प्रकार का एक आदर्श उदाहरण है। .NET रिफ्लेक्टर आपके लिए उत्तर दे सकता है।

या आप इसे SO पर पोस्ट कर सकते हैं और किसी अन्य व्यक्ति को Reflector स्थापित कर सकते हैं जो आपके लिए इसका उत्तर देता है। ;)


इसके साथ मेरी एकमात्र समस्या यह है कि इसे इस तरह इस्तेमाल करना कानूनी नहीं है;)

@ पियरे, आप कैसे आंकते हैं? अगर और कुछ नहीं तो आप इन संदर्भों का
Microsoft.net / Microsoft /netframework.aspx

अधिकांश विकसित देशों में रिवर्स इंजीनियरिंग कोड कानूनी नहीं है। और यह बेकार है जब स्रोत आपके लिंक की तरह प्रकाशित होता है;)

2
@Pierre 303: AFAIK कॉपीराइट कानूनों में अक्सर एक अपवाद होता है जो कहता है कि अन्यथा उपयोग किए गए सॉफ़्टवेयर के साथ हस्तक्षेप करने के लिए रिवर्स इंजीनियरिंग की अनुमति है। इस उत्तर में उदाहरण उसी श्रेणी का है।
शार्प फुट

@ साभार: क्या आपके पास इसके बारे में कुछ संदर्भ हैं? मैं अतीत में ऐसी स्थितियों में रहा हूं और कानून के कारण आगे नहीं जा पाया। मैं वास्तव में उस से दिलचस्पी होगी।

5

मैं दो अलग-अलग मुद्दों के साथ मदद करने के लिए काफी नियमित रूप से (शायद एक या दो बार एक सप्ताह में) प्रतिक्षेपक का उपयोग करता हूं।

  1. खराब रूप से प्रलेखित एपीआई / लाइब्रेरी: इसके लिए मेरा पसंदीदा उदाहरण SharePoint है। SharePoint विकास करने के बारे में मुझे पता है कि प्रत्येक डेवलपर उपलब्ध प्रलेखन के पूरक के लिए इसका उपयोग करता है। क्या हम इसके बिना प्राप्त कर सकते हैं, अधिकांश भाग के लिए हाँ; लेकिन कई मामले सामने आए हैं, बल्कि यह काफी मुश्किल था।

  2. अस्पष्ट त्रुटि को डीबग करना: यह पता लगाने में भी उपयोगी हो सकता है कि कोई अपवाद क्यों फेंक रहा है। यदि आप देख सकते हैं कि अपवाद कहां हुआ है तो आप यह पता लगाने के लिए कॉल श्रृंखला का पता लगा सकते हैं कि समस्या क्या है (या तो गलत तरीके से लाइब्रेरी, बग, आदि का उपयोग करके)।


मैंने SharePoint विकास से जुड़े दर्द के बारे में काफी कुछ सुना है और मुख्य रूप से उस कारण से दूर रहा है। दूसरी ओर, यह एक उच्च मांग और अच्छी तरह से मुआवजा विशेषता की तरह लगता है।
c152driver

मैं इसे पिछले 18 महीनों से बंद कर रहा हूं (वर्तमान नौकरी ज्यादातर एसपी है) लेकिन मैं कह सकता हूं कि मैं बहुत बड़ा प्रशंसक नहीं हूं। मुझे लगता है कि ऐसा करने से बहुत दर्द होता है जो आपको शायद उसमें नहीं होना चाहिए और सिर्फ प्रलेखन की सामान्य कमी है। निश्चित रूप से उच्च मांग में और यदि आप अच्छे हैं तो उचित से अधिक मुआवजा है।
केन हेंडरसन 12

4

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

निश्चित रूप से, आपको बस इतना करना है कि आपका कोड बाधित है और रिफ्लेक्टर बेकार है (या यह आखिरी बार था जब मैंने जाँच की थी) लेकिन इसने मुझे अतीत में बहुत समय और निराशा से बचाया है।

इसके अलावा, मेरे पास कम से कम एक अवसर है जहां मैंने स्रोत कोड (मेरे पूर्व-संस्करण नियंत्रण युग में) खो दिया है, लेकिन संकलित कोड था और रिफ्लेक्टर ने मुझे अपना कोड वापस पाने में मदद की। बहुत सारे काम करने की आवश्यकता है क्योंकि टिप्पणियां, चर नाम आदि गलत हैं, लेकिन इससे मदद मिली।

इसके अलावा, कभी-कभी आपके पास कोड होता है, कहते हैं, VB.NET और आप यह देखना चाहते हैं कि यह कैसे किया जाएगा, कहते हैं, C # और Reflector विभिन्न भाषाओं के बीच स्विच कर सकते हैं।


आपको लगता है कि प्रमुख कारणों पर चोट लगी है। शायद मुझे अपने आप को भाग्यशाली मानना ​​चाहिए कि मैं उन स्थितियों में खुद को नहीं पा सका, अगर ऐसा है तो।
c152driver 20

3

जब रनटाइम पर असेंबली उत्पन्न करने के लिए Reflection.Emit का उपयोग करते हैं, तो Reflector आपके द्वारा अपेक्षित रूप से उत्पन्न कोड को नेत्रहीन रूप से सत्यापित करने के लिए एक अत्यंत मूल्यवान उपकरण बन जाता है।


2

रिफ्लेक्टर आपको यह पता लगाने में मदद करता है कि दस्तावेज गलत कब है। मुझे .NET 1.1 में वापस CLR के StringBuilder प्रलेखन तरीके से एक बग मिला। लंबाई संपत्ति के लिए प्रलेखन ने यह कहा:

यदि निर्दिष्ट लंबाई वर्तमान लंबाई से अधिक है, तो इस उदाहरण के स्ट्रिंग मान का अंत रिक्त स्थान के साथ गद्देदार है।

मैंने इसे ध्यान में रखते हुए स्ट्रिंगबर्ल का उपयोग करने की कोशिश की, और विचित्र परिणाम मिले। मैंने रिफ्लेक्टर का इस्तेमाल किया, और समस्या को देखा। .NET 2.0 और आगे की लंबाई वाली प्रॉपर्टी के दस्तावेज में सही जानकारी है:

यदि निर्दिष्ट लंबाई वर्तमान लंबाई से अधिक है, तो वर्तमान स्ट्रिंग स्ट्रिंग ऑब्जेक्ट का स्ट्रिंग मान यूनिकोड NULL वर्ण (U + 0000) के साथ गद्देदार है।

यह एक बड़ा अंतर बना सकता है, अगर आप कहते हैं, आप परिणामी पाठ को मैसेजबॉक्स के साथ प्रदर्शित कर रहे हैं; मैसेजबॉक्स पाठ को पहले अशक्त वर्ण पर काट देता है।

परावर्तक इस तरह की चीजों का पता लगाना संभव बनाता है, यह देखने के लिए कि सीएलआर वास्तव में कैसे व्यवहार करता है, जैसा कि दस्तावेज़ीकरण कहता है, या उन सवालों के जवाब देने के लिए जो दस्तावेज़ीकरण का जवाब नहीं देता है।


1
... अभी तक .NET पर डेल्फी का उपयोग करने का एक और कारण। आप वास्तव में मानक पुस्तकालयों के लिए स्रोत प्राप्त करते हैं और उन्हें यह समझने के लिए विघटित होने का सहारा नहीं लेना पड़ता कि वे वास्तव में क्या कर रहे हैं।
मेसन व्हीलर


1
@ मेसन: जैसा @ मैथ्यू ने उत्तर दिया, .NET लाइब्रेरी का स्रोत कोड स्वतंत्र रूप से उपलब्ध है। स्रोत को डाउनलोड करने की परेशानी से गुजरने के बजाय, रिफ्लेक्टर अक्सर इस तरह की चीजों का निरीक्षण करने के लिए अधिक सुविधाजनक है।
एडम रॉबिन्सन

@ एडम: दिलचस्प है। फिर भी, यह तथ्य यह है कि यह केवल एक अलग डाउनलोड के रूप में उपलब्ध है, जो आपके अनुसार प्राप्त करने के लिए एक परेशानी है, मेरी बात को कम से कम कुछ हद तक रेखांकित करता है।
मेसन व्हीलर

1

कभी-कभी यह समझना सरल होता है कि एक पुस्तकालय क्या कर रहा है, यह कैसे कर रहा है, और उचित रूप से इसका स्रोत कोड देखकर इसका उपयोग करता है।

दूसरी बार, मैं बस उत्सुक हूं और झांकना चाहती हूं।

एक और सामान्य तरीका है कि मैं रिफ्लेक्टर का उपयोग करता हूं यह देखने के लिए कि फ्रेमवर्क कैसे कुछ को लागू करता है।

इस अवसर पर, मेरे पास एक पुस्तकालय है जिसका उपयोग वास्तव में पुरानी परियोजना में किया जा रहा है और हमारे पास कोई स्रोत कोड या दस्तावेज नहीं है। उन स्थितियों में परावर्तक काफी अमूल्य है।

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


0

मैं यह नहीं कहूंगा कि यह जरूरी है। लेकिन दुर्लभ मामलों में जहां आपको वास्तव में इसकी आवश्यकता होती है, यह अत्यधिक उपयोगी है।

एक उदाहरण लीजिए।

हाल ही में मुझे कुछ कोड बनाने थे जो रनटाइम को निम्नलिखित के लिए अभिव्यक्ति ट्री बना सकते थे, लेकिन संकलन समय पर आश्रित संपत्ति का नाम जाने बिना:

Expression<Func<TMock, TDependency>> expression = (x => x.Dependency);

आदेश में गतिशील रूप से एक मॉक (Moq ढांचे का उपयोग करके) स्थापित करने के लिए।

mock.Setup(expression).Returns(dependency);

मैंने जो किया वह यह था कि मैंने ठोस प्रकारों का उपयोग करके मूल अभिव्यक्ति संकलित की, फिर रिफ्लेक्टर का उपयोग करते हुए, मुझे पता चला कि मुझे निम्नलिखित कोड लिखना था:

var argument = Expression.Parameter(typeof(TMock), "x");
var getPropertyExpression = Expression.Property(argument, propertyInfo.Name);
var lambda = Expression.Lambda<Func<TMock, TDependency>>(getPropertyExpression, argument);            
Expression<Func<TMock, TDependency>> expression = lambda;    

मैं परीक्षण और त्रुटि का उपयोग कर यह पता लगाने में सक्षम होता। लेकिन रिफ्लेक्टर ने इसे आसान बना दिया।


0

क्योंकि यदि आप जानते हैं कि इसका उपयोग कैसे करना है, तो आपको प्रलेखन की आवश्यकता नहीं है - और अधिकांश एपीआई के पास कोई सार्थक दस्तावेज नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.