Gibi bir şey var mı:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
böylece döngü yapmak yerine, AppDomain.CurrentDomain.GetAssemblies()
doğrudan belirli bir montajı alabiliriz.
Yanıtlar:
Neyi başarmaya çalıştığınıza bağlıdır.
Sadece montajı almak istiyorsanız, aramanız gerekir System.Reflection.Assembly.Load()
(daha önce belirtildiği gibi). Bunun nedeni, .NET'in derlemenin halihazırda mevcut AppDomain'e önceden yüklenip yüklenmediğini otomatik olarak kontrol etmesi ve varsa tekrar yüklememesi.
Yalnızca montajın yüklenip yüklenmediğini kontrol etmeye çalışıyorsanız (belki bazı tanılama nedenlerinden dolayı), o zaman tüm yüklü montajların üzerinden döngü yapmanız gerekir.
Döngü oluşturmak isteyebileceğiniz başka bir neden, yalnızca bazı montaj bilgilerini bilmenizdir (örneğin, sürümden emin değilseniz). Yani, "gördüğünüzde tanıyacak" kadar biliyorsunuz, ancak yüklemek için yeterli değilsiniz. Yine de bu oldukça belirsiz ve olası olmayan bir senaryo.
Yalnızca derlemenin meta verilerine (sürüm, vb.) Erişmesi gerekenler için, yalnızca meta verileri yükleyebilen, muhtemelen bellek ve GÇ'den tasarruf sağlayan Assembly.ReflectionOnlyLoad (ad) 'ı kontrol edin.
Bu referans verdiğiniz bir derlemeyse, aşağıdaki gibi bir sınıf yazmayı seviyorum:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
ve sonra bu derleme için bir referansa ihtiyacınız olduğunda:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
İhtiyacınız olanı yapan bir uzatma yöntemi yazabilirsiniz.
Bu yöntem yalnızca yüklenen derlemeleri numaralandırır , muhtemelen yüklemeniz gerekirse Assembly.Load
, kabul edilen yanıttan kullanın .
public static class AppDomainExtensions
{
public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
{
return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
}
}
Ardından bu yöntemi bir AppDomain üzerinde şu şekilde çağırırsınız:
Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")
Eğer SomeAssembly geçerli AppDomain'e yüklenirse, yöntem onu döndürecektir, aksi takdirde geri dönecektir null
.
System.Reflection.Assembly sınıfına, özellikle de Load yöntemine bakın: MSDN
System.IO.FileNotFoundException
için meclis yüklenememişse bu fırlatır .