नाम से C # .Net विधानसभा कैसे प्राप्त करें?


89

क्या कुछ ऐसा है:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

इसलिए लूपिंग के बजाय AppDomain.CurrentDomain.GetAssemblies(), हम सीधे विशिष्ट असेंबली प्राप्त कर सकते हैं।

जवाबों:



72

मैंने LINQ के साथ हल किया

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}

7
यह केवल तभी काम करेगा जब प्रश्न में विधानसभा भरी हुई है। एक वेब एपीआई से एक डीएएल में प्रकार दर्ज करते समय मदद नहीं मिल सकती है
Chazt3n

17

यह इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं।

यदि आप केवल विधानसभा प्राप्त करना चाहते हैं, तो आपको कॉल करना चाहिए System.Reflection.Assembly.Load() (जैसा कि पहले ही बताया गया है)। ऐसा इसलिए है क्योंकि .NET स्वचालित रूप से जाँच करता है कि क्या विधानसभा पहले से ही वर्तमान AppDomain में लोड की गई है और यदि यह हो तो फिर से लोड नहीं करता है।

यदि आप केवल यह जांचने की कोशिश कर रहे हैं कि विधानसभा भरी हुई है या नहीं (कुछ निदान कारणों के लिए, शायद) तो आपको सभी भरी हुई विधानसभाओं पर लूप करना होगा।

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


System.Reflection.Assembly.Load () बस के रूप में मैं क्या जरूरत के रूप में एकदम सही है।
जॉनी डेसी

9

उन लोगों के लिए जिन्हें बस विधानसभा के मेटाडेटा (संस्करण, आदि) तक पहुंचने की आवश्यकता है, विधानसभा की जाँच करें ।eflectionOnlyLoad (नाम), जो केवल मेटाडेटा लोड करने में सक्षम है, संभवतः मेमोरी और आईओ पर बचत कर रहा है।


2
@ erik-reppen: MS डॉक्स के अनुसार यह पिछले संस्करणों में उपलब्ध है। मैं इसे 3.5 ऐप में उपयोग कर रहा हूं: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
codenheim

6

यदि यह एक विधानसभा है जिसे आपने संदर्भित किया है, तो मुझे निम्नलिखित की तरह एक वर्ग लिखना पसंद है:

namespace MyLibrary {
   public static class MyLibraryAssembly {
      public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
   }
}

और फिर जब भी आपको उस विधानसभा के संदर्भ की आवश्यकता हो:

var assembly = MyLibraryAssembly.Value;

यह एक बहुत ही साफ समाधान है जिसे मैं हमेशा ढूंढता रहा हूँ! मैं इसे इस तरह से उपयोग कर सकता हूं:options.RegisterFromAssembly(Application.AssemblyReference.Value)
एलिलसन पिफर

3

आप एक विस्तार विधि लिख सकते हैं जो आपको चाहिए।

यह विधि केवल भरी हुई असेंबली की गणना करेगी , यदि आपको संभवतः इसे लोड करने की आवश्यकता है, तो 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


मैं GetAssemblyByName () मिल didnot
Ziggler

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