मैं .NET अनुप्रयोग की निर्भरता कैसे निर्धारित करूं?


106

मैं .NET अनुप्रयोग की निर्भरता कैसे निर्धारित करूं? क्या डिपेंडेंसी वॉकर प्रबंधित ऐप के साथ काम करता है ? मैंने नवीनतम और ऐप को प्रोफाइल करने की कोशिश की है, लेकिन यह बिना स्पष्टीकरण के ही बाहर निकल जाता है। यदि यह .NET के साथ काम नहीं करता है, तो क्या कोई अन्य उपकरण है जो मुझे रन-टाइम DLL लोडिंग समस्या को डीबग करने में मदद करेगा?

जवाबों:


94

निर्भरता वॉकर सामान्य win32 बायनेरिज़ पर काम करता है। सभी .NET dll का और exe का एक छोटा स्टब हैडर भाग है जो उन्हें सामान्य बायनेरिज़ की तरह दिखता है, लेकिन यह सब मूल रूप से कहता है "लोड CLR" - तो यह सब निर्भरता वॉकर आपको बताएगा।

यह देखने के लिए कि आपके .NET ऐप वास्तव में किन चीजों पर निर्भर हैं, आप Red Gate से जबरदस्त उत्कृष्ट .NET रिफ्लेक्टर का उपयोग कर सकते हैं । (संपादित करें: ध्यान दें कि .NET रिफ्लेक्टर अब एक भुगतान किया गया उत्पाद है। ILSpy स्वतंत्र और खुला स्रोत है और बहुत समान है।)

इसमें अपना DLL लोड करें, राइट क्लिक करें, और 'एनालिसिस' को चुना - फिर आपको एक "डिपेंड्स ऑन" आइटम दिखाई देगा, जो आपको अन्य सभी dll (और उन dll के अंदर के तरीकों) को दिखाएगा, जिनकी उसे जरूरत है।

यह कभी-कभी मुश्किल हो सकता है, हालांकि इसमें आपका ऐप एक्स डीएलएल पर निर्भर करता है, और एक्स डीएल मौजूद है, लेकिन जो भी कारण लोड नहीं किया जा सकता है या रनटाइम पर स्थित नहीं हो सकता है।

उन प्रकार के मुद्दों का निवारण करने के लिए, Microsoft के पास एक असेंबली बाइंडिंग लॉग व्यूअर है जो आपको दिखा सकता है कि रनटाइम पर क्या हो रहा है


मुझे लगता है कि आप उस URL से थोड़ा सा चूक गए - .aspx लिंक पाठ में डाल दिया गया है। मैं इसे खोजने में कामयाब रहा।
ब्रायन स्टीवर्ट

ओह ... हाँ, मार्कडाउन कंट्रोल यूआरएल में कोष्ठक खाता है, और दुर्भाग्यवश MSDN (VS80) को url के:
ओरियन एडवर्ड्स

44
ध्यान दें कि 2011 की शुरुआत में, .NET रिफ्लेक्टर अब मुफ्त नहीं है। खुला स्रोत ILSpy परियोजना बहुत समान है।
योयो

1
असेंबली बाइंडिंग लॉग देखें v4.0.30319.1 पूरी तरह से अनुपयोगी है। लॉग प्रविष्टियों को कालानुक्रमिक क्रम में प्रदर्शित नहीं किया जाता है और आप उन्हें सॉर्ट नहीं कर सकते हैं। यह उन रास्तों को प्रदर्शित करता है जो दर्शक में फिट नहीं होते हैं और आप इसे आकार नहीं दे सकते। यह समय की पूरी बर्बादी है।
न्यूट्रिनो

dependencywalker.com आपको उन चीजों के url को शामिल करना चाहिए जिनका आप उल्लेख करते हैं, esp। अगर वे काम करते हैं।
टोड्डो

54

लोडिंग असेंबली के साथ समस्याओं को हल करने के लिए मुझे छोटी उपयोगिता AsmSpy एक अमूल्य उपकरण लगती है । यह विधानसभा संस्करणों सहित प्रबंधित विधानसभाओं के सभी विधानसभा संदर्भों को सूचीबद्ध करता है।

.dllनिम्न तर्कों के साथ निर्देशिका में इसे कमांड प्रॉम्प्ट में चलाएं :

asmspy . all

asmspy आउटपुट स्क्रीनशॉट

चॉकलेट के साथ जल्दी से स्थापित करें:

choco install asmspy

क्या यह C # फाइलों या रेजर के विचारों पर भी काम कर सकता है? मैं रन समय में एक mvc परियोजना से कुछ विचारों और एक नियंत्रक को निर्यात करके एक उप परियोजना बना रहा हूं। और मैं जानना चाहता हूं कि इन दृश्यों और नियंत्रक द्वारा क्या निर्भरताएं आवश्यक हैं ताकि मैं इन निर्भरताओं की प्रतिलिपि बना सकूं, जो कि रन-टाइम के दौरान आईआईएस पर एक अलग वेब परियोजना के रूप में उप-परियोजना को सार्वजनिक करने के लिए बनाई गई हैं।
रूपेंद्र

25

ILDASM में असेंबली फ़ाइल खोलें और MANIFEST में @ .assembly बाहरी देखें


1
क्या मैं इस तरह आश्रित विधानसभाओं के संस्करण को भी देख सकता हूँ? मुझे केवल निर्भरता नाम दिखाई देता है, न कि यह संस्करण भी।
माइकल आर

वास्तव में, हाँ, मैं इस तरह पर निर्भर विधानसभाओं के संस्करण को भी देख सकता हूँ, "MANIFES T" पर क्लिक करने के बाद
माइकल आर

1
यदि आप एक देव वातावरण में काम कर रहे हैं तो मुझे यह पसंद है - किसी भी अतिरिक्त उपयोगिताओं को डाउनलोड करने की आवश्यकता नहीं है
Dan Field

थर्ड पार्टी ऐप क्रैश होने पर, ग्राहक के केवल ildasm को कैसे स्थापित करें?
रियल्टो

18

.NET कोड निर्भरता ब्राउज़ करने के लिए, आप NDD की टूल की क्षमताओं का उपयोग कर सकते हैं। उपकरण का प्रस्ताव है:

उदाहरण के लिए इस तरह की क्वेरी दिख सकती है:

from m in Methods 
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)") 
where depth  >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }

और इसका परिणाम इस तरह दिखता है: (कोड मीट्रिक की गहराई पर ध्यान दें , 1 सीधे कॉल करने वालों के लिए है, 2 सीधे कॉल करने वालों के कॉल के लिए ...) ( कॉल ग्राफ़ के क्वेरी परिणाम को निर्यात करने के लिए ग्राफ़ बटन पर निर्यात करें )

ND निर्भरताएँ C # LINQ क्वेरी के माध्यम से ब्राउज़ करती हैं

निर्भरता ग्राफ इस तरह दिखता है:

ND निर्भरता ग्राफ

निर्भरता मैट्रिक्स की तरह दिखता है:

ND निर्भरता मैट्रिक्स

निर्भरता मैट्रिक्स ग्राफ की तुलना में कम -वास्तविक है , लेकिन यह कोड के जटिल वर्गों को ब्राउज़ करने के लिए अधिक अनुकूल है:

एन डी पर निर्भर मैट्रिक्स बनाम ग्राफ

डिस्क्लेमर: मैं एनडिपेंडेंट के लिए काम करता हूं


2
पैट्रिक को संभवतः उस शानदार उपकरण के लेखक का उल्लेख करना चाहिए था;)। यह वास्तव में जाँच के लायक है। इसे लिखने के लिए +1!
मिच गेहूं

1
अरे, मैंने सिर्फ इस पर ध्यान दिया। मुझे उनके ब्लॉग पोस्ट पढ़ने में बहुत मज़ा आता है - मुझे एनडीसिपेंडेंट की कोशिश करनी होगी!
ब्रायन स्टीवर्ट

2
@ मिचव्हीट - नाम चेक आउट हाहा, "पैट्रिक फ्रॉम एनडिपेंडेंट टीम"
kayleeFrye_onDeck

क्या मैं VStudio के साथ उपयोग कर सकता हूं? मेरे पीसी पर थर्ड पार्टी ऐप्स के ऐप क्रैश को डिबग करने के लिए नहीं
realtebo

16

आपको शेयरवेयर या टूल डाउनलोड और इंस्टॉल करने की जरूरत नहीं है। आप इसे .NET का उपयोग करके प्रोग्रामेटिक रूप से कर सकते हैंAssembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()

9
डीबगिंग उद्देश्यों के लिए, PowerShell के माध्यम से ऐसा करना अधिक सुविधाजनक है [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies():। उपकरण के लिए अस्पष्ट विंडोज़ स्थानों को डाउनलोड या शिकार न करने का अच्छा लाभ है। +1
jpmc26

3
मुझे सही करें अगर गलत है, लेकिन यह आपको केवल वही त्रुटि देगा जो कि एक लापता निर्भरता के साथ आपका आवेदन देता है तो यह बहुत उपयोगी नहीं है
jk।

यह तभी काम करता है जब असेंबली को AppDomain में लोड किया जाता है। परावर्तन के लिए भरी हुई असेंबलियाँ एक अशक्त सेट लौटाती हैं।
डेविड ए। ग्रे

7

आप मोनो toolchain का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं उपयोगिता के साथ विधानसभा एक .NET की निर्भरता को सूचीबद्ध करने के तर्क। यह दोनों और फाइलों पर काम करेगा ।monodis--assemblyref.exe.dll

उदाहरण का उपयोग:

monodis --assemblyref somefile.exe

उदाहरण आउटपुट (.exe):

$ monodis --assemblyref monop.exe
AssemblyRef Table
1: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

उदाहरण आउटपुट (.dll):

$ monodis --assemblyref Mono.CSharp.dll
AssemblyRef Table
1: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=System.Core
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
3: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
4: Version=4.0.0.0
    Name=System.Xml
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

5

असेंबली बाइंडिंग लॉगिंग सक्षम करें रजिस्ट्री मान EnableLog को HKLM \ Software \ Microsoft \ Fusion में 1 पर सेट करें। ध्यान दें कि बदलावों के प्रभाव के लिए आपको अपना एप्लिकेशन (iisreset का उपयोग करें) पुनरारंभ करना होगा।

युक्ति: जब आप किए जाते हैं तो फ्यूजन लॉगिंग बंद करना याद रखें क्योंकि इसे चालू करने के लिए एक प्रदर्शन जुर्माना है।


5

यह हास्यास्पद है कि मेरे पास एक समान मुद्दा था और कुछ भी उपयुक्त नहीं मिला और अच्छे पुराने डिपेंडेंसी वॉकर के बारे में पता था, इसलिए अंत में मैंने खुद लिखा।

यह .NET के साथ विशेष रूप से संबंधित है और यह दिखाएगा कि असेंबली में (और गायब) संदर्भ क्या है। यह मूल पुस्तकालय निर्भरता भी दिखाएगा।

यह निशुल्क (व्यक्तिगत उपयोग के लिए) है और यहां किसी के लिए भी उपलब्ध है: www.netdepends.com

www.netdepends.com

प्रतिक्रिया का स्वागत करते हैं।


असेंबलियों को खोलने के लिए कृपया ड्रैग एंड ड्रॉप सपोर्ट जोड़ें। यह अच्छा भी होगा यदि XCOPY परिनियोजन उपलब्ध हो, साथ ही स्रोत कोड भी।
गिगाप्लेक्स

मैंने अभी देखा कि वेबसाइट में उस खंड के लिए कोई स्पष्ट लिंक नहीं है जहां दो संस्करण हैं, और मुफ्त एक गैर-व्यावसायिक उपयोग के लिए है। मैंने गलती से हेल्प मेनू में "अपग्रेड टू प्रोफेशनल" विकल्प ढूंढ कर इस पर ठोकर खाई। डाउनलोड पृष्ठ पर यह कहते हुए एक नोटिस होना चाहिए कि यह व्यावसायिक उपयोग के लिए मुफ्त नहीं है।
गिगाप्लेक्स

@gigaplex मैं इन दोनों का ध्यान रखूंगा, मैं देखूंगा कि मैं क्या कर सकता हूं।
लॉयड

1
एक पेड़ और सभी उप-क्षेत्रों को खोलने के लिए शिफ्टक्लिक उपयोगी होगा।
टीएस

1
मुझे कैसे सूचित करें जो लापता निर्भरताएं हैं?
रियलटॉ

2

http://www.amberfish.net/

ChkAsm आपको एक बार में एक विशेष असेंबली की सभी निर्भरता दिखाएगा, जिसमें संस्करण भी शामिल हैं, और आसानी से आपको सूची में असेंबली की खोज करने देगा। ILSpy ( http://ilspy.net/ ) की तुलना में इस उद्देश्य के लिए बहुत बेहतर काम करता है , जो कि मैं इस कार्य के लिए उपयोग करता था।


1
2019 तक यह साइट कुछ
हद तक स्केच

@ McGuireV10 तो यह है। बदकिस्मती से। और एक त्वरित Google अब उस ऐप के लिए कोई हिट नहीं करता है।
mhenry1384

0

एक और आसान परावर्तक ऐड-इन है कि मैं उपयोग निर्भरता संरचना मैट्रिक्स है । यह देखना वास्तव में बहुत अच्छा है कि कौन सी कक्षाएं क्या उपयोग करती हैं। प्लस यह मुफ़्त है।


संस्करण संख्या नहीं दिखाता है, दुर्भाग्यवश, कम से कम वह संस्करण जो दृश्य स्टूडियो ऐड-इन के रूप में स्थापित होता है।
mhenry1384

0

विकल्प के साथ अपने .NET असेंबली को संकलित करने का प्रयास करें --staticlink:"Namespace.Assembly"। यह संकलक को संकलन समय पर सभी निर्भरता में खींचने के लिए मजबूर करता है। यदि यह निर्भरता भर में आता है जिसका संदर्भ नहीं दिया गया है तो यह आम तौर पर उस विधानसभा के नाम के साथ एक चेतावनी या त्रुटि संदेश देगा।

Namespace.Assemblyनिर्भरता की समस्या होने पर आपको असेंबली पर संदेह है। आमतौर पर इस विधानसभा को केवल सांख्यिकीय रूप से जोड़ने से सभी निर्भरताएं सकर्मक रूप से संदर्भित होंगी।


-4

सबसे अच्छा ऐप जिसे मैं देखता हूं और उपयोग करता हूं, मिस्ड / समस्याग्रस्त dlls दिखाता हूं: http ://www.d dependencywalker.com/


2
यह उपकरण .NET असेंबली के साथ मदद नहीं करेगा।
केविन पैंको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.