2009-01-19 26 views
82

नेट में, मैं सभी ऐपडोमेन पर सभी लोड असेंबली को गिनना चाहता हूं। मेरे प्रोग्राम के ऐपडोमेन के लिए ऐसा करना काफी आसान है AppDomain.CurrentDomain.GetAssemblies()। क्या मुझे किसी भी तरह से ऐपडोमेन तक पहुंचने की ज़रूरत है? या क्या पहले से ही एक उपकरण है जो यह करता है?मैं सभी लोड असेंबली कैसे सूचीबद्ध करूं?

+0

ध्यान दें कि 'GetAssemblies() 'काम नहीं करेगा, क्योंकि यह रिकर्सिव नहीं है और यह किसी भी नेस्टेड असेंबली संदर्भों को याद करेगा। मैंने http://stackoverflow.com/questions/383686/how-do-you-loop-through-currently-loaded-assemblies/26300241#26300241 पर 'GetAssemblies()' का एक पुनरावर्ती संस्करण जोड़ा है। – Contango

उत्तर

71

दृश्य स्टूडियो

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

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

enter image description here

प्रोसेस एक्सप्लोरर

का उपयोग करके आप एक बाहरी उपकरण आप एक प्रक्रिया पर उपयोग कर सकते हैं Process Explorer (, फ्रीवेयर माइक्रोसॉफ्ट द्वारा प्रकाशित)

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

प्रोग्राम

चेक this SO प्रश्न बताते हैं कि यह कैसे करना है के रूप में अन्य जानकारी से पता चलता है।

+1

यह यहां समझाए जाने से भी बेहतर है, क्योंकि प्रक्रिया के लिए प्रॉपर्टी पेज में, प्रोसेस एक्सप्लोरर दिखाता है कि कौन सा ऐपडोमेन ('साझा डोमेन' समेत) असेंबली लोड हो जाती है। तो यह केवल उस से अधिक दिखाता है जो डीएलएस प्रक्रिया में लोड हो जाते हैं। यह जानना अच्छा होगा कि वे यह दिखाने के लिए किस एपीआई का उपयोग करते हैं (इसके बारे में 'प्रोग्रामेटिक' लिंक केवल CurrentDomain में असेंबली देगा)। – Govert

15

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

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>"); 
        } 
       } 
      } 
     } 
+0

btw ... मैं इसे आरंभिक पोस्ट से बाहर रखा गया है, लेकिन मैं इतना 'foreach तरह की प्रतिक्रियाएं के कुछ फ़िल्टर्ड (asm.GetTypes में टाइप करें प्रकार()) {\t \t \t \t \t \t अगर ((type.ToString() IndexOf ("ACLASSIMLOOKINGFOR")> = 0) || (type.ToString()। IndexOf ("BCLASSIMLOOKINGFOR")> = 0)) {... ' – s15199d

+2

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

+0

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

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