मैं सी # प्रतिबिंब एपीआई के साथ खेल रहा हूं। मैं असेंबली में कक्षाओं, विधियों इत्यादि की आसानी से Type
जानकारी लोड कर सकता हूं, हालांकि, अब मुझे आश्चर्य है कि मैं विधि के अंदर कोड कैसे लोड और पढ़ सकता हूं?क्या मैं विधि में कोड का निरीक्षण करने के लिए प्रतिबिंब का उपयोग कर सकता हूं?
उत्तर
बेसिक उत्तर:
आप कर सकते हैं प्रतिबिंब एपीआई (System.Reflection) के साथ नहीं।
कारण यह है कि प्रतिबिंब एपीआई मेटाडेटा (वर्गों का प्रकार, नाम और विधि के हस्ताक्षर, ...) पर काम करने के लिए डिज़ाइन किया गया है, लेकिन डेटा स्तर पर नहीं (जो आईएल-स्ट्रीम स्वयं होगा)।
विस्तारित उत्तर:
आप फेंकना कर सकते हैं (न कि उन्हें पढ़ने) System.Reflection.Emit साथ आईएल (जैसे ILGenerator श्रेणी)।
MethodInfo.GetMethodBody()
के माध्यम से आप एक विधि के कार्यान्वयन के लिए बाइनरी आईएल-स्ट्रीम प्राप्त कर सकते हैं। लेकिन आमतौर पर यह पूरी तरह से बेकार है।
बाह्य पुस्तकालय (जैसे Cecil) हैं जिनका उपयोग आप किसी विधि के अंदर कोड को पढ़ने/संशोधित/जोड़ने/हटाने के लिए कर सकते हैं।
क्या आप प्रतिनिधि के माध्यम से विधि का उल्लेख नहीं कर सकते हैं, फिर प्रतिनिधि से अभिव्यक्ति ट्री बनाएं और पेड़ का निरीक्षण करें? –
@ मैट ग्रीर: नहीं। आप एक प्रतिनिधि के विधि शरीर को एक अभिव्यक्ति वृक्ष में "रिवर्स इंजीनियर" नहीं कर सकते हैं। – LBushkin
@ मैट: यह आपको कोड * अंदर * कोड नहीं दे रहा है, आपको बस 'MethodCallExpression' मिलेगा जो आपको उसी' MethodInfo' तक पहुंच प्रदान करता है जिसे आप प्रतिबिंब API के साथ अधिक सीधे प्राप्त कर सकते थे। – Aaronaught
नहीं
यह एक विशेषता है जो सी # के अगले संस्करण के लिए बनाई गई है। प्रतिबिंब की तुलना में अधिक जानकारी प्राप्त करने के लिए आप CodeDom का उपयोग कर सकते हैं, लेकिन आप अभी तक पार्स पेड़ से पूछताछ नहीं कर सकते हैं।
वैसे हमेशा मोनो होता है, मोनो में कंपाइलर एक सेवा है, और आप रनटाइम पर पार्स पेड़ प्राप्त कर सकते हैं।
बेहतर सवाल यह है कि आप क्यों चाहते हैं?
हां, इसे प्राप्त करने का एक तरीका होना चाहिए: .NET Reflector Tool यह भी करता है। हालांकि, आपको यह नहीं बता सकता कि यह कैसे किया गया है।
आप परावर्तक को प्रतिबिंबित क्यों नहीं करते हैं;) – ntziolis
परावर्तक का उपयोग नहीं करता है प्रतिबिंब के .NET ढांचे की भावना में कम से कम प्रतिबिंब नहीं। यह वास्तव में पीई फ़ाइल को पार करता है और आईएल कोड को .TEXT अनुभाग से अलग करता है। फिर आईएल को एक लक्षित भाषा में मानचित्र/डिकंपाइल करने के लिए मिलान करने वाला कुछ बहुत ही स्मार्ट और शांत पैटर्न होता है। –
यदि आपको यह वास्तविक समय करने की आवश्यकता नहीं है, तो Reflector पर एक नज़र डालें। आप किसी भी .NET असेंबली (एमएस कोर डीएलएल सहित) को अलग कर सकते हैं और अपनी पसंद की भाषा में कोड देख सकते हैं। यह बहुत शैक्षणिक हो सकता है।
अद्यतन क्या किसी ने इस बात को समझने के लिए परावर्तक पर परावर्तक का उपयोग करने का प्रयास किया है?
नोट, यह कोड को डी-अनुकूलित नहीं करता है। इसलिए यदि आईएल को एक कंपाइलर अनुकूलन किया गया था, तो यह अपने मूल निर्माण स्रोत पर वापस नहीं लौटाया जाता है, लेकिन थोड़ा कम मानव लिखित अनुकूलित संस्करण में।यह देखने का एक साफ तरीका है कि आप सबसे कुशलता से क्या कर सकते हैं। – DevelopingChris
आप परावर्तक पर परावर्तक का उपयोग नहीं कर सकते हैं। इसे आज़माएं और देखें, आपको एक अच्छा आश्चर्य मिलेगा। – Aaronaught
परावर्तक एन्क्रिप्ट किया गया है कि यह स्वयं पर प्रतिबिंबित नहीं हो सकता है, मुझे लगता है कि उन्होंने ऐसा करने के लिए डॉटफुस्केटर का उपयोग किया था। – DevelopingChris
यह कोड पढ़ने के द्वारा आपके मतलब पर निर्भर करता है। कोड के 4 रूप हैं।
1- स्रोत कोड उदा। मूल C# या VB.NET - नहीं, तुम नहीं इस प्रतिबिंब
2- प्रतीकात्मक आईएल कोड के साथ प्राप्त कर सकते हैं - नहीं, आप प्रतिबिंब के साथ इस प्राप्त नहीं कर सकते
3 JITed विधानसभा कोड - नहीं, आप प्रतिबिंब के साथ इस प्राप्त नहीं कर सकते
4- आईएल बाइट्स, आईएल संकलित वास्तविक बाइट्स, यह प्राप्त कर सकता है।
उदाहरण के लिए MethodBase.GetMethodBody() पर एक नज़र डालें, आप आईएल बाइट्स, स्थानीय चर, अपवाद फ्रेम इत्यादि प्राप्त कर सकते हैं। http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx
'GetMethodBody() 'मुझे लगता है कि निकटतम है, मुझे लगता है। – LBushkin
का प्रकार कर सकते हैं। प्रासंगिक कार्य MethodBase.GetMethodBody है।
यह बिल्कुल सबसे उपयोगी API नहीं है। आप विधि के अंदर क्या है इसके बारे में कुछ बुनियादी जानकारी प्राप्त कर सकते हैं, और आप आईएल को बाइट सरणी के रूप में प्राप्त कर सकते हैं। यह इसके बारे में।
Mono.Cecil पुस्तकालय है, जो जो वास्तविक Instructions
शामिल अपने स्वयं के MethodBody
कार्यान्वयन के साथ एक MethodDefinition
वर्ग को उजागर करता है, तो आप कच्चे बाइट कोड की व्याख्या करने की जरूरत नहीं है में एक थोड़ा बेहतर एपीआई नहीं है। फिर भी, अगर आप इसके बारे में सी # कोड प्राप्त करना चाहते हैं, तो ला रिफ्लेक्टर, आप बहुत निराश होने जा रहे हैं। इसके अलावा, सेसिल बहुत अच्छी तरह से प्रलेखित नहीं है।
यदि आप अभी भी कोशिश करना चाहते हैं, तो शुभकामनाएं।
अब कर रहे हैं पुस्तकालयों/संकुल है कि आप Expression
करने के लिए इसे डिकंपाइल विधि कोड का निरीक्षण किया और यहां तक कि करने की अनुमति:
- 1. क्या मैं जेनेरिक का उपयोग करने के लिए निम्नलिखित कोड को परिवर्तित कर सकता हूं?
- 2. प्रतिबिंब का उपयोग कर वास्तविक विधि हस्ताक्षर
- 3. क्या मैं एक्शनस्क्रिप्ट कोड दस्तावेज़ करने के लिए DoxyGen का उपयोग कर सकता हूं?
- 4. क्या मैं एक गैर वर्चुअल विधि ओवरराइड करने वाली विधि का उपयोग कर सकता हूं?
- 5. देशी कोड का निरीक्षण
- 6. मैं नेटवर्क ट्रैफ़िक का निरीक्षण करने के लिए IE8 डेवलपर टूल का उपयोग कैसे कर सकता हूं?
- 7. मैं कैसे जांच सकता हूं कि प्रतिबिंब का उपयोग कर कोई विधि स्थिर है या नहीं?
- 8. क्या मैं विधि पद्धति को लपेटने के लिए सजावटी पैटर्न का उपयोग कर सकता हूं?
- 9. अजगर प्रतिबिंब - मैं इस का उपयोग कर सकते एक विधि परिभाषा के स्रोत कोड
- 10. क्या मैं प्रतिबिंब का उपयोग कर सी # में एक निजी रीडोनली विरासत क्षेत्र बदल सकता हूं?
- 11. मशीन स्टैक का निरीक्षण करने के लिए जीडीबी का उपयोग
- 12. क्या मैं जेएनआई का उपयोग कर जावा कोड में सी ++ ऑब्जेक्ट्स का संदर्भ दे सकता हूं?
- 13. क्या मैं PHP में टिप्पणी करने के लिए हैश साइन (#) का उपयोग कर सकता हूं?
- 14. क्या मैं गो में प्रतिबिंब का उपयोग करके एक नया फ़ंक्शन बना सकता हूं?
- 15. क्या मैं समय कोड पुनर्लेखन संकलन के लिए Roslyn का उपयोग कर सकता हूं?
- 16. क्या मैं .NET में "System.Currency" का उपयोग कर सकता हूं?
- 17. क्या मैं log4j का उपयोग कर जावा विधि के भीतर लॉगिंग स्तर सेट कर सकता हूं?
- 18. नोड के अंतर्निहित डीबगर का उपयोग कर चर का निरीक्षण?
- 19. स्टॉप-प्रोसेस करने के लिए पावरशेल का उपयोग करें, क्या मैं पुष्टि रद्द कर सकता हूं?
- 20. मैं निर्देशिका का चयन करने के लिए NSSavePanel का उपयोग कैसे कर सकता हूं?
- 21. मैं छवि के केंद्र में स्क्रॉल करने के लिए scrollRectToVisible का उपयोग कैसे कर सकता हूं?
- 22. मैं रूबी में क्लास विधि और इंस्टेंस विधि का उपयोग कैसे कर सकता हूं?
- 23. क्या मैं रैम-गहन अनुप्रयोग को स्केल करने के लिए टेराकोटा का उपयोग कर सकता हूं?
- 24. क्या मैं दृश्य प्रतिपादन को तेज करने के लिए कैलियर का उपयोग कर सकता हूं?
- 25. क्या मैं इंटरफ़ेस को लागू करने के लिए एक्सटेंशन विधियों का उपयोग कर सकता हूं?
- 26. क्या मैं वैश्विक चर परिभाषित करने के लिए __init__.py का उपयोग कर सकता हूं?
- 27. क्या मैं श्रृंखला तुलना करने के लिए पूर्णांक पर कोलेसे ऑपरेटर का उपयोग कर सकता हूं?
- 28. क्या मैं AJAX कॉल करने के लिए फोनगैप Jquery का उपयोग कर सकता हूं?
- 29. एंड्रॉइड, क्या मैं कई मानों को पास करने के लिए putExtra का उपयोग कर सकता हूं
- 30. क्या मैं संग्रहित प्रक्रिया परिणामों को सॉर्ट करने के लिए ऑर्डर का उपयोग कर सकता हूं?
क्या यह परिदृश्य है जो इसे उपयोगी बनाता है? यह ओओ के मौलिक किरायेदारों में से एक तोड़ता है जो encapsulation है। लेकिन इसके अलावा आईएल के रूप में कोड वास्तव में वही नहीं है। – DevelopingChris
@ डेवलपिंग क्रिस: यदि आप एक डीबगर या कोड विश्लेषण उपकरण लिख रहे हैं, तो यह एक असेंबली लोड करने और विधि के शरीर का विश्लेषण करने में सक्षम होने के लिए उपयोगी हो सकता है। यह वास्तव में, FxCop जैसे उपकरण हैं। – LBushkin
.NET का लक्षित दर्शक अमेरिकी निगम है (और दूसरा शायद कुछ छोटे व्यवसाय)। यदि आप .NET obfuscation को बाईपास कर सकते हैं, तो (उत्पादन करने में महंगा) सॉफ़्टवेयर आसानी से प्रतिस्पर्धी की उंगलियों में उड़ सकता है। – micahhoover