Bagaimana cara mendapatkan C # .Net Assembly dengan nama?


90

Apa ada yang seperti:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

jadi alih-alih mengulang-ulang AppDomain.CurrentDomain.GetAssemblies(), kita bisa langsung mendapatkan perakitan tertentu.

Jawaban:



74

Saya menyelesaikan dengan LINQ

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

8
Ini hanya akan bekerja jika rakitan yang dimaksud dimuat. Mungkin tidak membantu saat mendaftarkan jenis dalam DAL dari API Web
Chazt3n

17

Itu tergantung pada apa yang ingin Anda capai.

Jika Anda hanya ingin mendapatkan perakitan, maka Anda harus menelepon System.Reflection.Assembly.Load()(seperti yang telah ditunjukkan). Itu karena .NET secara otomatis memeriksa apakah rakitan telah dimuat ke AppDomain saat ini dan tidak memuatnya lagi jika sudah.

Jika Anda hanya mencoba untuk memeriksa apakah rakitan telah dimuat atau tidak (untuk beberapa alasan diagnostik, mungkin) maka Anda harus mengulang semua rakitan yang dimuat.

Alasan lain Anda mungkin ingin mengulang adalah jika Anda hanya mengetahui beberapa informasi assembly (mis. Anda tidak yakin versinya). Artinya, Anda cukup tahu untuk "mengenalinya saat Anda melihatnya", tetapi tidak cukup untuk memuatnya. Itu adalah skenario yang cukup kabur dan tidak mungkin.


System.Reflection.Assembly.Load () sesempurna yang saya butuhkan.
Jronny


7

Jika ini adalah majelis yang telah Anda rujuk, saya ingin menulis kelas seperti berikut:

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

dan kemudian kapan pun Anda membutuhkan referensi ke rakitan itu:

var assembly = MyLibraryAssembly.Value;

Ini adalah solusi yang sangat bersih yang selalu saya cari! Saya dapat menggunakannya seperti ini:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer

3

Anda dapat menulis metode ekstensi yang melakukan apa yang Anda butuhkan.

Metode ini hanya akan menghitung rakitan yang dimuat , jika Anda mungkin perlu memuatnya, gunakan Assembly.Loaddari jawaban yang diterima.

public static class AppDomainExtensions
{
    public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
    {
        return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
    }
}

Kemudian Anda memanggil metode ini pada AppDomain seperti ini:

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

Jika SomeAssembly dimuat ke dalam AppDomain saat ini, metode akan mengembalikannya, jika tidak maka akan kembali null.


Saya tidak menemukan GetAssemblyByName ()
Ziggler

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.