সি # .নেট এসেম্বলি নাম অনুসারে কীভাবে পাবেন?


90

এখানে কি কিছু আছে:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

সুতরাং লুপিংয়ের পরিবর্তে AppDomain.CurrentDomain.GetAssemblies()আমরা কেবলমাত্র নির্দিষ্ট সমাবেশটি সরাসরি পেতে পারি।

উত্তর:



74

আমি লিনকিউ দিয়ে সমাধান করেছি

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

8
এটি কেবল তখনই কার্যকর হবে যদি প্রশ্নে সমাবেশটি লোড হয়। কোনও ওয়েব এপিআই
ড্যাজে টাইপগুলি

17

এটি আপনি কী অর্জন করার চেষ্টা করছেন তার উপর নির্ভর করে।

আপনি যদি কেবল সমাবেশ পেতে চান তবে আপনার কল করা উচিত System.Reflection.Assembly.Load()(ইতিমধ্যে চিহ্নিত হিসাবে) এর কারণেই .NET অ্যাসেম্বলিটি ইতিমধ্যে বর্তমান অ্যাপডোমাইনে লোড হয়েছে কিনা তা স্বয়ংক্রিয়ভাবে পরীক্ষা করে।

যদি আপনি কেবল সমাবেশটি লোড হয়েছে কিনা তা পরীক্ষা করে দেখার চেষ্টা করছেন (কিছু ডায়াগনস্টিক কারণে, সম্ভবত) তবে আপনাকে সমস্ত ভারী অ্যাসেম্বলিতে লুপ করতে হবে।

আপনি লুপ করতে চাইতে পারেন এমন আরও একটি কারণ হ'ল যদি আপনি কেবল সমাবেশ সংক্রান্ত কিছু তথ্য জানেন (যেমন, আপনি সংস্করণ সম্পর্কে নিশ্চিত নন)। এটি, "আপনি যখন দেখবেন তখন এটি সনাক্ত করতে" আপনি যথেষ্ট জানেন তবে এটি লোড করার পক্ষে পর্যাপ্ত নয়। যদিও এটি মোটামুটি অস্পষ্ট এবং অসম্ভব দৃশ্য।


সিস্টেম.প্রয়োজন
জোরনি

9

যাদের কেবল সমাবেশের মেটাডেটা (সংস্করণ ইত্যাদি) অ্যাক্সেস করতে হবে তাদের জন্য অ্যাসেম্বলি পরীক্ষা করে দেখুন R কেবলমাত্র মেটাডেটা লোড করতে সক্ষম হ'ল কেবলমাত্র মেটাডেটা লোড করতে সক্ষম, কেবল স্মৃতি এবং আইও সংরক্ষণ করে।


4
@ এরিক-রেপেন: এমএস ডক্স অনুসারে এটি পূর্ববর্তী সংস্করণগুলিতে উপলব্ধ। আমি এটি একটি 3.5 অ্যাপ্লিকেশনটিতে ব্যবহার করছি: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
কোডেনহিম

7

এটি যদি আপনার উল্লেখ করা কোনও সমাবেশ হয় তবে আমি নীচের মতো একটি ক্লাস লিখতে চাই:

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

এবং তারপরে যখনই আপনার এই সমাবেশটির একটি রেফারেন্স দরকার:

var assembly = MyLibraryAssembly.Value;

এটি একটি খুব পরিষ্কার সমাধান যা আমি সর্বদা খুঁজছি! আমি এটি এর মতো ব্যবহার করতে পারি:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer

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);
    }
}

তারপরে আপনি এই পদ্ধতিটিকে এইভাবে একটি অ্যাপডোমেনে কল করুন:

Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")

তাহলে SomeAssembly বর্তমান AppDomain মধ্যে লোড হয় পদ্ধতি এটা ফিরে আসবে, অন্যথায় এটি ফিরে আসবে null


আমি getAs એવુંByName () খুঁজে পাইনি
জিগ্লার

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.