Apa ada yang seperti:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
jadi alih-alih mengulang-ulang AppDomain.CurrentDomain.GetAssemblies()
, kita bisa langsung mendapatkan perakitan tertentu.
c#
assemblies
Jronny
sumber
sumber
System.IO.FileNotFoundException
jika rakitan tidak dapat dimuat.Saya menyelesaikan dengan LINQ
Assembly GetAssemblyByName(string name) { return AppDomain.CurrentDomain.GetAssemblies(). SingleOrDefault(assembly => assembly.GetName().Name == name); }
sumber
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.
sumber
Bagi mereka yang hanya perlu mengakses metadata assembly (versi, dll.), Lihat Assembly.ReflectionOnlyLoad (name), yang hanya dapat memuat metadata, mungkin menghemat memori dan IO.
sumber
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;
sumber
options.RegisterFromAssembly(Application.AssemblyReference.Value)
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.Load
dari 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
.sumber
Lihatlah kelas System.Reflection.Assembly, khususnya metode Load: MSDN
sumber