क्या कुछ ऐसा है:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
इसलिए लूपिंग के बजाय AppDomain.CurrentDomain.GetAssemblies()
, हम सीधे विशिष्ट असेंबली प्राप्त कर सकते हैं।
जवाबों:
मैंने LINQ के साथ हल किया
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
यह इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं।
यदि आप केवल विधानसभा प्राप्त करना चाहते हैं, तो आपको कॉल करना चाहिए System.Reflection.Assembly.Load()
(जैसा कि पहले ही बताया गया है)। ऐसा इसलिए है क्योंकि .NET स्वचालित रूप से जाँच करता है कि क्या विधानसभा पहले से ही वर्तमान AppDomain में लोड की गई है और यदि यह हो तो फिर से लोड नहीं करता है।
यदि आप केवल यह जांचने की कोशिश कर रहे हैं कि विधानसभा भरी हुई है या नहीं (कुछ निदान कारणों के लिए, शायद) तो आपको सभी भरी हुई विधानसभाओं पर लूप करना होगा।
एक और कारण हो सकता है कि आप लूप करना चाहें, यदि आप केवल कुछ विधानसभा जानकारी जानते हैं (उदाहरण के लिए, आप संस्करण के बारे में निश्चित नहीं हैं)। यही है, आप "इसे देखते समय इसे पहचानने के लिए" पर्याप्त हैं, लेकिन इसे लोड करने के लिए पर्याप्त नहीं है। हालांकि यह काफी अस्पष्ट और असंभावित परिदृश्य है।
उन लोगों के लिए जिन्हें बस विधानसभा के मेटाडेटा (संस्करण, आदि) तक पहुंचने की आवश्यकता है, विधानसभा की जाँच करें ।eflectionOnlyLoad (नाम), जो केवल मेटाडेटा लोड करने में सक्षम है, संभवतः मेमोरी और आईओ पर बचत कर रहा है।
यदि यह एक विधानसभा है जिसे आपने संदर्भित किया है, तो मुझे निम्नलिखित की तरह एक वर्ग लिखना पसंद है:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
और फिर जब भी आपको उस विधानसभा के संदर्भ की आवश्यकता हो:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
आप एक विस्तार विधि लिख सकते हैं जो आपको चाहिए।
यह विधि केवल भरी हुई असेंबली की गणना करेगी , यदि आपको संभवतः इसे लोड करने की आवश्यकता है, तो Assembly.Load
स्वीकृत उत्तर से उपयोग करें ।
public static class AppDomainExtensions
{
public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
{
return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
}
}
फिर आप इस तरीके को AppDomain पर इस तरह से कॉल करते हैं:
Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")
यदि SomeAssembly को वर्तमान AppDomain में लोड किया जाता है, तो विधि इसे वापस कर देगी, अन्यथा यह वापस आ जाएगी null
।
System.Reflection.Assembly वर्ग पर एक नज़र डालें, विशेष रूप से लोड विधि: MSDN
System.IO.FileNotFoundException
अगर विधानसभा को लोड नहीं किया जा सकता है।