2012-01-13 16 views
16

क्या सभी असेंबली प्राप्त करने का कोई तरीका है जो किसी दिए गए असेंबली पर निर्भर करता है?आश्रित असेंबली प्राप्त करें?

छद्म:

Assembly a = GetAssembly(); 
var dependants = a.GetDependants(); 
+0

क्या आपको इसे प्रोग्रामिक रूप से चाहिए? यदि नहीं, तो आप इसके लिए एमएस निर्भर का उपयोग कर सकते हैं। –

+0

प्रोग्रामेटिक रूप से। मुझे सभी निर्भर प्रकारों पर [AddProviderTransparent] (http://msdn.microsoft.com/en-us/library/dd783170.aspx) का उपयोग करने की आवश्यकता है। – Shimmy

+4

आप इस दायरे को कैसे परिभाषित करेंगे? असेंबली जान सकती है कि यह किस पर निर्भर करता है लेकिन क्या यह बता सकता है कि इस पर निर्भर करता है? प्रश्न के लिए +1;) – StaWho

उत्तर

13

आप वर्तमान आवेदन डोमेन से निर्भर विधानसभाओं को खोजने के लिए चाहते हैं, आप GetDependentAssemblies समारोह नीचे परिभाषित की तरह कुछ इस्तेमाल कर सकते हैं आश्रितों।

+0

मेरे समेत हर कोई मूर्खता के बारे में सोचने के लिए मूर्ख नहीं है। सीधे और सरल। – Shimmy

+1

+1 अच्छा। मैंने कभी विधानसभा नहीं देखी थी। गेट रेफरेंस एस्सेम्ब्लीज़() पहले। ऐसा लगता है कि यह .Net 4 में जोड़ा गया था। ठीक है - आप हर दिन कुछ सीखते हैं। –

6

प्रोग्राम के, आप Mono.Cecil का उपयोग करते हैं कर सकते हैं।

कुछ इस तरह (इस पर ध्यान दें काम नहीं करेगा अगर डिबगर जुड़ा हुआ है - जैसे यदि आप इसे वी.एस. ही अंदर से चलाने):

public static IEnumerable<string> GetDependentAssembly(string assemblyFilePath) 
{ 
    //On my box, once I'd installed Mono, Mono.Cecil could be found at: 
    //C:\Program Files (x86)\Mono-2.10.8\lib\mono\gac\Mono.Cecil\0.9.4.0__0738eb9f132ed756\Mono.Cecil.dll 
    var assembly = AssemblyDefinition.ReadAssembly(assemblyFilePath); 
    return assembly.MainModule.AssemblyReferences.Select(reference => reference.FullName); 
} 

आप इस प्रोग्राम के तो करना है, की जरूरत नहीं है NDepend या Reflector आपको यह जानकारी दे सकता है।

+0

आपका कोड असेंबली की एक सूची देता है जिसे 'असेंबलीफाइलपाथ' द्वारा इंगित असेंबली द्वारा संदर्भित किया जाता है, है ना? क्या ओपी क्या पूछ रहा है? मुझे लगता है (शायद गलती से) कि ओपी विपरीत चाहता है: एक असेंबली 'ए' दिया गया है जो सभी असेंबली को संदर्भित करता है। क्या मैं कुछ भूल रहा हूँ? –

+0

आह - शायद आप सही हैं - अभी सुनिश्चित नहीं है।यह निर्भर करता है कि क्या आप शीर्षक पढ़ते हैं (जो बताता है कि मैंने यहां क्या जवाब दिया है), या पाठ विवरण (जो आपको बताता है कि आप सही हैं)! –

+0

सहमत हैं, यह थोड़ा उलझन में है। लेकिन अगर मैं सही हूं, तो ओपी को शायद पहले टिप्पणियों में StaWho द्वारा उठाए गए प्रश्न का उत्तर देना होगा! मुझे "स्कोप" में प्रत्येक असेंबली की खोज करने और उनमें से प्रत्येक के लिए अपना कोड निष्पादित करने की तुलना में समस्या को हल करने का कोई और तरीका नहीं दिखता है। –

1

मुझे रनटाइम पर निर्भरता प्राप्त करने के लिए किसी भी अंतर्निहित संभावना से अवगत नहीं है। तो मुझे लगता है कि सबसे आसान समाधान एक विस्तार विधि को परिभाषित करता है और this एप्लिकेशन से कोड का उपयोग करता है। मैंने एक साल पहले एक आवेदन किया था। लेकिन इसका उपयोग कोड नहीं है।

उम्मीद है कि इससे मदद मिलती है।

2

सबसे पहले अपने दायरे, जैसे परिभाषित:

  1. अपने आवेदन के बिन निर्देशिका में सभी विधानसभाओं

  2. अपने आवेदन के बिन निर्देशिका में सभी विधानसभाओं + GAC

  3. में सभी विधानसभाओं सभी विधानसभाओं दुनिया में किसी भी मशीन पर।

तो बस (*) अपने दायरे में सभी विधानसभाओं के माध्यम से पुनरावृति, और प्रतिबिंब का उपयोग करता है, तो वे अपने लक्ष्य विधानसभा पर निर्भर जाँच करने के लिए।

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

(*) यदि आपका दायरा 3 ऊपर है तो काफी आसान नहीं हो सकता है।

private IEnumerable<Assembly> GetDependentAssemblies(Assembly analyzedAssembly) 
{ 
    return AppDomain.CurrentDomain.GetAssemblies() 
     .Where(a => GetNamesOfAssembliesReferencedBy(a) 
          .Contains(analyzedAssembly.FullName)); 
} 

public IEnumerable<string> GetNamesOfAssembliesReferencedBy(Assembly assembly) 
{ 
    return assembly.GetReferencedAssemblies() 
     .Select(assemblyName => assemblyName.FullName); 
} 

analyzedAssembly पैरामीटर विधानसभा जिसके लिए आप सभी को खोजने के लिए चाहते हैं का प्रतिनिधित्व करता है: