Yüklenen tüm montajları nasıl listelerim?


101

.Net'te, tüm AppDomains üzerinden yüklenen tüm derlemeleri numaralandırmak istiyorum. Programımın AppDomain'i için yapmak yeterince kolay AppDomain.CurrentDomain.GetAssemblies(). Her AppDomain'e bir şekilde erişmem gerekiyor mu? Yoksa bunu yapan bir araç zaten var mı?


1
GetAssemblies()Özyinelemeli olmadığından ve iç içe geçmiş montaj referanslarını gözden kaçıracağından bunun işe yaramayacağını unutmayın . Ben bir özyinelemeli versiyonunu ekledik GetAssemblies()at stackoverflow.com/questions/383686/... .
Contango

@Contango: AppDomain.CurrentDomain.GetAssemblies()gayet iyi. Referansları yinelemeli olarak yürümesine gerek yoktur, çünkü ilk etapta referansları numaralandırmaz.
Ben Voigt

Yanıtlar:


95

Visual Studio'yu kullanma

  1. İşleme bir hata ayıklayıcı ekleyin (ör. Hata ayıklamayla başlayın veya Hata Ayıkla> İşleme ekle)
  2. Hata ayıklama sırasında Modüller penceresini gösterin (Hata Ayıklama> Pencereler> Modüller)

Bu, her derleme, uygulama etki alanı hakkında ayrıntılar verir ve simgeleri yüklemek için birkaç seçeneğe sahiptir (yani, hata ayıklama bilgilerini içeren pdb dosyaları).

görüntü açıklamasını buraya girin

Process Explorer'ı Kullanma

Harici bir araç istiyorsanız, İşlem Gezgini'ni kullanabilirsiniz (ücretsiz yazılım, Microsoft tarafından yayınlanmıştır)

Bir işleme tıklayın ve kullanılan tüm montajların bir listesini gösterecektir. Araç, dosya tutamaçları vb.Gibi diğer bilgileri gösterdiği için oldukça iyidir.

Programlı olarak

Nasıl yapılacağını açıklayan bu SO sorusunu kontrol edin .


1
Bu, burada açıklanandan bile daha iyidir, çünkü bir işlemin özellikler sayfasında İşlem Gezgini, tam olarak hangi AppDomain ('Paylaşılan Etki Alanı' dahil) derlemelerinin yüklendiğini gösterir. Dolayısıyla, sürece hangi .dll'lerin yüklendiğinden daha fazlasını gösterir. Bunu göstermek için hangi API'leri kullandıklarını bilmek güzel olurdu ('Programlı olarak' bağlantısı sadece CurrentDomain'deki Meclisleri verecektir).
Govert

22

İşte benim son bulduğum şey. Bu, tüm özelliklerin ve yöntemlerin bir listesi ve her yöntem için tüm parametreleri listeledim. Tüm değerleri elde etmeyi başaramadım.

foreach(System.Reflection.AssemblyName an in System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()){                      
            System.Reflection.Assembly asm = System.Reflection.Assembly.Load(an.ToString());
            foreach(Type type in asm.GetTypes()){   
                //PROPERTIES
                foreach (System.Reflection.PropertyInfo property in type.GetProperties()){
                    if (property.CanRead){
                        Response.Write("<br>" + an.ToString() + "." + type.ToString() + "." + property.Name);       
                    }
                }
                //METHODS
                var methods = type.GetMethods();
                foreach (System.Reflection.MethodInfo method in methods){               
                    Response.Write("<br><b>" + an.ToString() + "."  + type.ToString() + "." + method.Name  + "</b>");   
                    foreach (System.Reflection.ParameterInfo param in method.GetParameters())
                    {
                        Response.Write("<br><i>Param=" + param.Name.ToString());
                        Response.Write("<br>  Type=" + param.ParameterType.ToString());
                        Response.Write("<br>  Position=" + param.Position.ToString());
                        Response.Write("<br>  Optional=" + param.IsOptional.ToString() + "</i>");
                    }
                }
            }
        }

btw ... İlk foreach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
gönderiden

2
Bu soruya hiç cevap vermiyor.
Govert

GetExecutingAssembly () kullanmak yerine, programım tarafından kullanılan Assemblies'in daha iyi bir listesini aldığımdan emin olmak için GetEntryAssembly () kullandım. Eğer ExecutingAssembly bir DLL ise, birkaçını kaçıracağım.
Harry Glinos

6
kullanmayı deneyin: Assembly [] assemblies = AppDomain.CurrentDomain.GetAssemblies ();
DanW
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.