Ada göre C # .Net Meclisi nasıl alınır?


90

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:



74

LINQ ile çözdüm

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

8
Bu, yalnızca söz konusu montaj yüklendiğinde çalışacaktır. Bir Web API'sinden bir
DAL'deki

17

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.


System.Reflection.Assembly.Load (), ihtiyacım olan kadar mükemmel.
Jronny


7

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;

Bu, her zaman aradığım çok temiz bir çözüm! Bunu şu şekilde kullanabilirim:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer

3

İ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.


GetAssemblyByName ()
Ziggler'ı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.