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.

Jronny
sumber

Jawaban:

107

Sudahkah Anda mencoba melihat Assembly.Load (...) ?

cyberzed
sumber
6
Bagi mereka yang bertanya-tanya, ini melempar System.IO.FileNotFoundExceptionjika rakitan tidak dapat dimuat.
Rudey
74

Saya menyelesaikan dengan LINQ

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Fabio
sumber
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.

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

Bagi mereka yang hanya perlu mengakses metadata assembly (versi, dll.), Lihat Assembly.ReflectionOnlyLoad (name), yang hanya dapat memuat metadata, mungkin menghemat memori dan IO.

Mathieu Frenette
sumber
2
@ erik-reppen: Menurut dokumen MS, ini tersedia dalam versi sebelumnya. Saya menggunakannya di aplikasi 3.5: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
codenheim
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;
Dave Cousineau
sumber
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.

Marcell Toth
sumber
Saya tidak menemukan GetAssemblyByName ()
Ziggler
2

Lihatlah kelas System.Reflection.Assembly, khususnya metode Load: MSDN

Maximilian Mayerl
sumber