एक उपकरण पहले से ही एक पेड़ के प्रारूप में यह करता है कि वहाँ होना चाहिए, लेकिन हमेशा की तरह संदिग्ध में से कोई भी नृत्य Usages का पता लगाएं बिना यह है लगता है।
तो, यहां सभी सदस्य चर खोजने, तो विधियों के माध्यम से जा रहा है और क्या वे उन्हें स्पर्श पता लगाना द्वारा प्रतिबिंब API का उपयोग करके एक प्रयास है।
आप मूल रूप से, इस बिंदु पर आईएल पर देख रहे हैं तो जब तक आप अपने आप को पार्स नियम लगाने के लिए चाहते हैं आप सेसिल की तरह एक disassembler का उपयोग करना चाहेंगे। मैं इस deprecated single file implementation cause it's easy का उपयोग कर रहा हूँ। Roslyn विश्लेषक या JustDecompile प्लगइन की तरह कुछ और मार्ग होगा, लेकिन मुझे कोई अनुभव नहीं है।
किनारे के मामले होने के बाध्य हैं, और यदि आप एक संपूर्ण निर्भरता ग्राफ की तलाश में हैं तो कोड बहुत अधिक जटिल होगा - लेकिन त्वरित और गंदे विश्लेषण के लिए, इसे कम से कम आपको एक सिंहावलोकन प्राप्त करना चाहिए।
तो, मूल रूप से आप प्रतिबिंब के साथ साथ एक आईएल पाठक चर से एक नक्शा बनाने के लिए उपयोग -> विधियों (आप अन्य तरीके से भी जा सकते हैं, लेकिन यह शायद कम मूल्यवान है):
var variables = typeof(SmallBallOfMud).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
var methods = typeof(SmallBallOfMud).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic);
var d = new Dictionary<string, List<string>>();
foreach (var v in variables) d.Add(v.Name, new List<string>());
// this particular disassembler chokes on externally implemented methods
foreach (var m in methods.Where(m => (m.MethodImplementationFlags | MethodImplAttributes.IL) == 0)) {
var instructions = MethodBodyReader.GetInstructions(m);
foreach (var i in instructions) {
// we'll only check for direct field access here
var f = i.Operand as FieldInfo;
if (f == null) continue;
d[f.Name].Add(m.Name);
}
}
हमारे परिणाम होगा जैसे:
state1: Method1 (1), Method2 (1)
state2: Method2 (2)
state3: Method1 (1), Method2 (2)
जो "state3" पढ़ने के लिए है "Method1" एक बार, और "Method2" द्वारा दो बार किया जाता है।
स्रोत
2015-07-02 21:32:29
नहीं कि सिर्फ सदस्य चर हो सकता है? जब तक आप उत्परिवर्तित पैरामीटर के बारे में भी चिंतित न हों? –
आर # आपकी मदद कर सकता है। यह सुनिश्चित नहीं है कि इसके लिए अंतर्निहित फ़ंक्शन है या नहीं। @ मार्कब्रेकेट, ओपी सदस्य चर के बारे में बात कर रहा है जिसे सदस्य चर नहीं होना चाहिए, क्योंकि इन्हें केवल एक विधि के अंदर उपयोग किया जाता है। – bzlm
@bzlm, लगभग। वे वैश्विक चर हैं, जिनका उपयोग दर्जनों कार्यों के बीच वैश्विक स्तर पर राज्य को पारित करने के लिए किया जाता है। इसलिए मैं प्रत्येक फ़ंक्शन में वेरिएबल को स्थानीयकृत करने की कोशिश कर रहा हूं जहां आवश्यक है और इसके बजाय पैरामीटर का उपयोग करें, इसलिए प्रोग्राम की स्थिति और उसके डेटा को समझना आसान है, साफ-सफाई करने और सभी ग्लोबल्स को दूर करने के लिए। – eidylon