मैं सभी भरी हुई विधानसभाओं को कैसे सूचीबद्ध करूं?


101

.Net में, मैं सभी AppDomains पर सभी भरी हुई असेंबलियों की गणना करना चाहूंगा। मेरे कार्यक्रम के AppDomain के लिए इसे करना काफी आसान है AppDomain.CurrentDomain.GetAssemblies()। क्या मुझे किसी तरह हर AppDomain तक पहुंचने की आवश्यकता है? या वहाँ पहले से ही एक उपकरण है जो ऐसा करता है?


1
ध्यान दें कि GetAssemblies()यह काम नहीं करेगा, क्योंकि यह पुनरावर्ती नहीं है और यह किसी भी नेस्टेड असेंबली संदर्भों को याद नहीं करेगा। मैंने stackoverflow.com/questions/383686/…GetAssemblies() पर एक पुनरावर्ती संस्करण जोड़ा है ।
कंटैंगो

@ कांटांगो: AppDomain.CurrentDomain.GetAssemblies()पूरी तरह से ठीक है। इसे संदर्भों को फिर से चलने की जरूरत नहीं है, क्योंकि यह पहली बार में संदर्भों की गणना नहीं कर रहा है।
बेन वोइगट

जवाबों:


95

विजुअल स्टूडियो का उपयोग करना

  1. डिबगर को प्रक्रिया में संलग्न करें (जैसे डिबगिंग या डीबग से प्रारंभ करें> प्रक्रिया में संलग्न करें)
  2. डिबगिंग करते समय, मॉड्यूल विंडो दिखाएं (डीबग> विंडोज> मॉड्यूल)

यह प्रत्येक असेंबली, ऐप डोमेन के बारे में विवरण देता है और इसमें प्रतीकों को लोड करने के लिए कुछ विकल्प होते हैं (यानी pdb फाइलें जिसमें डिबग जानकारी होती है)।

यहां छवि विवरण दर्ज करें

प्रोसेस एक्सप्लोरर का उपयोग करना

यदि आप एक बाहरी उपकरण चाहते हैं तो आप प्रोसेस एक्सप्लोरर (फ्रीवेयर, Microsoft द्वारा प्रकाशित) का उपयोग कर सकते हैं

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

प्रोग्राम के रूप में

इस SO प्रश्न की जाँच करें जो बताता है कि यह कैसे करना है।


1
यहाँ समझाया जाना बेहतर है, क्योंकि किसी प्रक्रिया के लिए गुण पृष्ठ में, प्रोसेस एक्सप्लोरर ठीक वही दिखाता है जो AppDomain ('साझा डोमेन' सहित) असेंबली में लोड होता है। तो यह केवल अधिक से अधिक दिखाता है जो .dll को प्रक्रिया में लोड किया जाता है। यह जानकर अच्छा लगेगा कि वे इसे दिखाने के लिए किस एपीआई का उपयोग करते हैं ('प्रोग्रामिकली' लिंक के बारे में सिर्फ करंटबल में असेंबली देगा)।
शासन

22

यहाँ है क्या मैं के साथ समाप्त हुआ। यह सभी गुणों और विधियों की एक सूची है, और मैंने प्रत्येक विधि के लिए सभी मापदंडों को सूचीबद्ध किया है। मैं सभी मूल्यों को पाने में सफल नहीं हुआ।

foreach(System.Reflection.AssemblyName an in System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()){                      
            System.Reflection.Assembly asm = System.Reflection.Assembly.Load(an.ToString());
            foreach(Type type in asm.GetTypes()){   
                //PROPERTIES
                foreach (System.Reflection.PropertyInfo property in type.GetProperties()){
                    if (property.CanRead){
                        Response.Write("<br>" + an.ToString() + "." + type.ToString() + "." + property.Name);       
                    }
                }
                //METHODS
                var methods = type.GetMethods();
                foreach (System.Reflection.MethodInfo method in methods){               
                    Response.Write("<br><b>" + an.ToString() + "."  + type.ToString() + "." + method.Name  + "</b>");   
                    foreach (System.Reflection.ParameterInfo param in method.GetParameters())
                    {
                        Response.Write("<br><i>Param=" + param.Name.ToString());
                        Response.Write("<br>  Type=" + param.ParameterType.ToString());
                        Response.Write("<br>  Position=" + param.Position.ToString());
                        Response.Write("<br>  Optional=" + param.IsOptional.ToString() + "</i>");
                    }
                }
            }
        }

btw ... मैंने इसे प्रारंभिक पोस्ट से बाहर कर दिया, लेकिन मैंने कुछ प्रतिक्रियाओं को फ़िल्टर किया जैसे किforeach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d 18

2
यह प्रश्न का उत्तर नहीं देता है।
10

GetExecutingAssembly () का उपयोग करने के बजाय, मैंने अपने प्रोग्राम द्वारा उपयोग की जाने वाली असेंबली की एक बेहतर सूची प्राप्त करने के लिए GetEntryAssembly () का उपयोग किया। यदि ExecutingAssembly डीएलएल होता है, तो मैं उनमें से कुछ को याद करने जा रहा हूं।
हैरी Glinos

6
उपयोग करने का प्रयास करें: असेंबली [] असेंबलियों = AppDomain.CurrentDomain.GetAssemblies ();
डेनव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.