2009-08-20 34 views
10

द्वारा उपयोग किए गए डीएलएल के नाम कैसे प्राप्त करें मैं अपने ऐप द्वारा उपयोग की जाने वाली सभी असेंबली (.dlls) को पढ़ने का तरीका देख रहा हूं।आवेदन

मानक सी # प्रोजेक्ट में "संदर्भ" फ़ोल्डर होता है, जब इसे विस्तारित किया जाता है तो मैं उपयोग की जाने वाली सभी पुस्तकालयों को पढ़ सकता हूं।

मेरा लक्ष्य प्रोग्रामिंग रूप से सभी असेंबली को पढ़ता है जिसका उपयोग मेरे समाधान में प्रत्येक प्रोजेक्ट द्वारा किया जाता है।

अंततः मैं देखना चाहता हूं कि मेरे संकलित * .exe एप्लिकेशन द्वारा कौन से पुस्तकालयों का उपयोग किया जाता है।

उत्तर

14

क्या आपने Assembly.GetReferencedAssemblies पर देखा है?

ध्यान दें कि आपके द्वारा उपयोग किए जाने वाले किसी भी संदर्भ मेटाडेटा में उत्सर्जित नहीं होंगे, इसलिए आप उन्हें निष्पादन समय पर नहीं देख पाएंगे।

मैंने असेंबली निर्दिष्ट किए बिना नामित प्रकार ढूंढने के लिए पहले GetReferencedAssemblies का उपयोग किया है।

1

आप AppDomain.GetAssemblies का उपयोग कर सकते हैं।
लेकिन यह आपके आवेदन में स्पष्ट रूप से या निहित रूप से उपयोग की जाने वाली सभी असेंबली देगा।

+2

मैं समझता हूँ के रूप में यह उन लोगों को देगा जो पहले ही लोड हो चुके हैं। मेटाडेटा में संदर्भित किए जा सकते हैं, लेकिन अभी तक लोड नहीं किए गए हैं क्योंकि उन्हें अभी तक निष्पादन में आवश्यकता नहीं है। –

+0

आपकी टिप के लिए धन्यवाद! यह AppDomain.CurrentDomain.GetAssemblies() भी दिलचस्प था – Maciej

0

यदि आपके पास Assembly ऑब्जेक्ट है, तो आप असेंबली का उपयोग करने वाले किसी भी संदर्भ प्राप्त करने के लिए GetReferencedAssemblies() पर कॉल कर सकते हैं। विधानसभाओं वर्तमान में चल रहे परियोजना का उपयोग करता है की एक सूची प्राप्त करने के लिए, आप का उपयोग कर सकते हैं:

System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies() 
0

मुझे लगता है कि आप का उपयोग कर सकते हैं:

AssemblyName[] assemblies = this.GetType().Assembly.GetReferencedAssemblies(); 
3
System.Reflection.Assembly []ar=AppDomain.CurrentDomain.GetAssemblies(); 

foreach (System.Reflection.Assembly a in ar) 
{ 
Console.WriteLine("{0}", a.FullName); 
} 
9

ठीक से ऐसा करने के लिए, आप विधानसभाओं चलने के लिए की जरूरत है , निर्भरताओं को उठाते हुए ... यदि आपके exe को Dll_A की आवश्यकता है, और Dll_A को Dll_B की आवश्यकता है (भले ही exe इसका संदर्भ नहीं दे), तो आपके exe को भी Dll_B की आवश्यकता है।

आप प्रतिबिंब के माध्यम से इस (किसी भी असेंबली पर) पूछ सकते हैं; यह एक छोटे काम लेता है (विशेष रूप से, वृत्तीय संदर्भ से सुरक्षा के लिए जो होता है, यहाँ एक उदाहरण है कि "प्रविष्टि विधानसभा" पर शुरू होता है, लेकिन यह बस के रूप में आसानी से किसी भी विधानसभा हो सकता है:

List<string> refs = new List<string>(); 
    Queue<AssemblyName> pending = new Queue<AssemblyName>(); 
    pending.Enqueue(Assembly.GetEntryAssembly().GetName()); 
    while(pending.Count > 0) 
    { 
     AssemblyName an = pending.Dequeue(); 
     string s = an.ToString(); 
     if(refs.Contains(s)) continue; // done already 
     refs.Add(s); 
     try 
     { 
      Assembly asm = Assembly.Load(an); 
      if(asm != null) 
      { 
       foreach(AssemblyName sub in asm.GetReferencedAssemblies()) 
       { 
        pending.Enqueue(sub); 
       } 
       foreach (Type type in asm.GetTypes()) 
       { 
        foreach (MethodInfo method in type.GetMethods(
         BindingFlags.Static | BindingFlags.Public | 
          BindingFlags.NonPublic)) 
        { 
         DllImportAttribute attrib = (DllImportAttribute) 
          Attribute.GetCustomAttribute(method, 
           typeof(DllImportAttribute)); 
         if (attrib != null && !refs.Contains(attrib.Value)) 
         { 
          refs.Add(attrib.Value); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.Error.WriteLine(ex.Message); 
     } 
    } 
    refs.Sort(); 
    foreach (string name in refs) 
    { 
     Console.WriteLine(name); 
    } 
+0

क्या यह पीएनवोक के माध्यम से उपयोग किए जाने वाले अप्रबंधित डीएलएल का भी पता लगाएगा, या क्या यह केवल डीएलएस का प्रबंधन करता है? –

+0

केवल प्रबंधित डीएलएस। आप पी/Invoke एम देखने के लिए प्रतिबिंब का उपयोग कर सकते हैं विधि - लेकिन यह थोड़ा अलग प्रतिबिंब होगा। –

+0

मैं यह कैसे करूँगा? प्रतिबिंब का मेरा ज्ञान सीमित है, क्या आप मुझे सही दिशा में इंगित कर सकते हैं? –