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