2012-01-05 13 views
15

विजुअल स्टूडियो के साथ, मैं एक उदाहरण के रूप में संलग्न चित्र के रूप में डीएल संदर्भ देख सकता हूं। इस संदर्भ जानकारी के साथ, मैं सभी संदर्भ फ़ाइल नाम प्राप्त करने के लिए सभी अन्य संदर्भों को खोजने के लिए (उदाहरण से) संरचना प्रोजेक्ट खोल सकता हूं।.NET DLL संदर्भ/निर्भरता जांच उपयोगिता

क्या कोई ऐसी उपयोगिता है जो स्वचालित रूप से यह काम करती है? मेरा मतलब है, एक .NET असेंबली दिया गया है, यह डीएलएल के नाम देने के लिए सभी संदर्भ/निर्भरताओं को बार-बार जांचता है।

मैंने साइगविन के विचित्र और Depends.exe की जांच की, लेकिन वे अन्य परियोजनाओं से डीएलएस दिखाने के लिए प्रतीत नहीं होते हैं, लेकिन केवल सिस्टम डीएलएस।

enter image description here

+1

आप आसानी से असेंबली के साथ एक लिख सकते हैं। GETReferencedAssemblies()। EXE पर शुरू करें। बेशक, आपको * असेंबली फाइलों को ढूंढने में सक्षम होना चाहिए, जो .config फ़ाइलों और प्रकाशक नीतियों के साथ काफी बालों वाली हो सकती है। कारण यह एक सार्वभौमिक उपयोगिता नहीं है। –

उत्तर

19

हाँ: ildasm.exe। यह एसडीके के साथ स्थापित है। C:

एक पथ की तरह में होना चाहिए प्रोग्राम फ़ाइलें (x86) माइक्रोसॉफ्ट SDKs \ Windows \ \ \ v7.0A \ बिन

+0

लेकिन यह केवल देशी विदेशी डीएलएस दिखाता है। .NET संदर्भित असेंबली को कैसे देखें? –

+5

यदि आप मैनिफेस्ट पर डबल-क्लिक करते हैं, तो यह .NET संदर्भित असेंबली दिखाता है: .assembly बाहरी सिस्टम। { .publickeytoken = (बी 0 3 एफ 5 एफ 7 एफ 11 डी 5 0 ए 3 ए) //। _....: .ver 4: 0: 0: 0 } .assembly निर्वासन System.Data { .publickeytoken = (बी 7 7A 5C 56 19 34 E0 89) // .z \ v.4 .. .ver 4: 0: 0: 0 } –

+0

हाँ .. मुझे http://stackoverflow.com/questions/18637173/how-is-the-net-referenced-assemblies-names-resolved-by-the-clr-at के साथ भ्रमित हो गया -runtime? noredirect = 1 # comment27463835_18637173 –

1

मैं किसी भी उपकरण का पता नहीं है आप के लिए स्वचालित रूप से ऐसा करने के लिए, लेकिन मैं किसी भी टूल (या आपको) चरणों का रूपरेखा कर सकता हूं।

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

संदर्भित असेंबली के फ़ाइल नाम आपको बताने का कोई सही तरीका नहीं है। संदर्भ मेनिफेस्ट में असेंबली नाम (नाम, संस्करण, संस्कृति, आदि) के रूप में संग्रहीत हैं और फ़ाइल नाम के रूप में नहीं। जब .NET रनटाइम को एक संदर्भित असेंबली लोड करने की आवश्यकता होती है तो यह खोजने के लिए विभिन्न खोजों का उपयोग करती है, और इन खोजों का परिणाम पर्यावरण से पर्यावरण में भिन्न हो सकता है। बेशक, यह आपके लिए कोई समस्या नहीं हो सकती है यदि आप केवल अपनी विकास मशीन पर असेंबली की तलाश में हैं, उदाहरण के लिए।

असेंबली संदर्भों को हल करने के लिए तकनीकें पहले से लोड की गई किसी भी असेंबली को खोजना, ग्लोबल असेंबली कैश में देखकर, एप्लिकेशन निर्देशिका में देखकर, एप्लिकेशन कॉन्फ़िगरेशन फ़ाइलों या प्रकाशक नीतियों और अन्य लोगों के आधार पर रीडायरेक्ट करना शामिल है। अधिक जानकारी के लिए एमएसडीएन में "हाउ द रनटाइम लोकेट्स असेंबली" लेख के लिए Google। इसके अतिरिक्त, आपका एप्लिकेशन सिस्टम :: AppDomain :: AssemblyResolve ईवेंट को संभालने के द्वारा अपना स्वयं का संदर्भ समाधान करने के लिए पंजीकरण कर सकता है।

3

आप प्रदान की ildasm.exe उपयोग कर सकते हैं, या यदि आप कुछ थोड़ा और अधिक शक्तिशाली चाहते हैं, आप की कोशिश कर सकते हैं:

:

Reflector

और भी बेहतर, मुक्त कोशिश dotPeek

नमस्ते,

1

थी एस कोड सभी संदर्भों को खोजने में काफी अच्छा काम करेगा। "temp" यह पता लगाए गए सभी संदर्भों का एक डंप होगा।

private void PerformReferenceAnalysis() 
    { 
     StringBuilder builder = new StringBuilder(); 
     HashSet<string> loadedAssemblies = new HashSet<string>(); 
     PerformReferenceAnalysis(System.Reflection.Assembly.GetExecutingAssembly(), builder, string.Empty, loadedAssemblies); 
     string temp = builder.ToString(); 
    } 

    private void PerformReferenceAnalysis(System.Reflection.Assembly assembly, StringBuilder builder, string leadingWhitespace, HashSet<string> loadedAssemblies) 
    { 
     if (builder.Length > 0) 
     { 
      builder.AppendLine(); 
     } 
     builder.Append(leadingWhitespace + assembly.FullName); 
     System.Reflection.AssemblyName[] referencedAssemblies = assembly.GetReferencedAssemblies(); 
     foreach (System.Reflection.AssemblyName assemblyName in referencedAssemblies) 
     { 
      if (loadedAssemblies.Contains(assemblyName.Name)) 
      { 
       continue; 
      } 
      loadedAssemblies.Add(assemblyName.Name); 
      System.Reflection.Assembly nextAssembly; 
      try 
      { 
       nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.FullName); 
      } 
      catch (Exception) 
      { 
       try 
       { 
        nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.Name); 
       } 
       catch (Exception) 
       { 
        nextAssembly = null; 
       } 
      } 
      if (nextAssembly != null) 
      { 
       PerformReferenceAnalysis(nextAssembly, builder, leadingWhitespace + "| ", loadedAssemblies); 
      } 
     } 
    } 
10

मैं की जांच इस प्रकार के लिए AsmSpy का उपयोग करना चाहते। डाउनलोड करने के लिए एक एकल exe है और फिर मैं इसे आसान पहुंच के लिए अपने टूल्स फ़ोल्डर में डाल दिया। https://github.com/mikehadlow/AsmSpy

+3

+1 AsmSpy * .dgml प्रारूप में एक आउटपुट फ़ाइल का उत्पादन कर सकता है (विजुअल स्टूडियो 2013, या 2015 के साथ खोला जा सकता है। जब खोला जाता है वीएस, ** आप रुचि के डीएल को खोजने के लिए इसे ** (Ctrl-F) खोज सकते हैं (उदाहरण के लिए एक लापता डीएल)। उस पर निर्भर सभी डीएलएस का चयन करने के लिए "मैं" दबाएं। फिर ग्राफ़/चयन/इनवर्ट चयन पर रा-क्लिक करें, अपने कीबोर्ड पर हटाएं दबाएं - और आप एक लापता डीएल पर निर्भर डीएलएस का एक अच्छा पठनीय ग्राफ प्राप्त कर सकते हैं। न तो dotPeek, न ही ILSpy (परावर्तक के वारिस) खोज योग्य प्रारूप में निर्भरताओं की एक सूची का उत्पादन कर सकता है। – farfareast

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