2010-11-16 18 views
10

वर्तमान में निष्पादित असेंबली द्वारा संदर्भित सभी असेंबली के पथ कैसे प्राप्त करें? GetReferencedAssmblies() मुझे AssemblyName[] एस देता है। मैं वहां से कहां से लोड हो सकता हूं, वहां से?सभी संदर्भित असेंबली के पथ प्राप्त करें

+4

इस प्रयास करें http://stackoverflow.com/questions/1582510/ Get-pathes-of-assemblies-used-in-type –

+0

बहुत धन्यवाद। यह मेरे लिए हल हो गया। –

+0

सभी संदर्भित असेंबली कैसे प्राप्त करें, इसके बारे में पूरी तरह से काम करने वाले उदाहरण के लिए, http://stackoverflow.com/questions/383686/how-do-you-loop-through-currently-loaded-assemblies/26300241#26300241 देखें। – Contango

उत्तर

12

आप जब तक विधानसभा लोड किया जाता है पता नहीं कर सकते हैं। असेंबली रिज़ॉल्यूशन एल्गोरिदम जटिल है और आप अनुमान लगा सकते हैं कि यह क्या करेगा। Assembly.Load(AssemblyName) ओवरराइड को कॉल करने से आपको असेंबली का संदर्भ मिल जाएगा, और इसकी स्थान संपत्ति आपको बताती है कि आपको क्या चाहिए।

हालांकि, अगर आप वास्तव में नहीं सामने विधानसभाओं लोड करने के लिए, से पहले JIT कम्पाइलर यह करता है चाहता हूँ। यह अक्षम है और समस्याओं की संभावना शून्य नहीं है। कार्यक्रम के जवाब देने से पहले आप उदाहरण के लिए AppDomain.AssemblyResolve ईवेंट आग लग सकते हैं। इस सवाल पूछने से बचें।

+0

सही उत्तर के लिए बहुत धन्यवाद। –

0

CodeBase संपत्ति को पूरा पथ नाम प्रदान करना चाहिए।

+0

क्या आपने इसे आजमाया है? –

+5

दुर्भाग्य से, कोडबेस प्रत्येक संदर्भित असेंबली पर शून्य देता है। :-) –

0

आप इस तरह विधानसभा का URL स्थान प्राप्त कर सकते हैं:

Assembly.GetExecutingAssembly().GetReferencedAssemblies()[0].CodeBase 
+1

कोडबेस शून्य लौटाता है। समाधान इस पोस्ट में है कि जेसन इवान्स ने मूल टिप्पणी पर अपनी टिप्पणी में शामिल किया था। इसके अलावा, हंस पासेंट का भी सही जवाब है। –

2

हंस पासेंट के उत्तर के बाद, और CodeBase संपत्ति में हमेशा null शामिल था, मैं इसके साथ आया। यह सभी असेंबली नहीं मिल सकता है क्योंकि वे सभी पहले ही लोड नहीं हो सकते हैं। मेरी स्थिति में, मैं एक पहले से भरी हुई विधानसभा के सभी संदर्भ की तलाश करनी है, तो यह अच्छी तरह से काम:

IEnumerable<string> GetAssemblyFiles(Assembly assembly) 
{ 
    var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
    foreach (var assemblyName in assembly.GetReferencedAssemblies()) 
     yield return loadedAssemblies.SingleOrDefault(a => a.FullName == assemblyName.FullName)?.Location; 
} 

उपयोग:

var assemblyFiles = GetAssemblyFiles(typeof(MyClass).Assembly); 
संबंधित मुद्दे