2009-08-20 26 views
10

Uygulamam tarafından kullanılan tüm derlemeleri (.dlls) okuma yolunu arıyorum.Uygulama tarafından kullanılan DLL'lerin İsimleri nasıl edinilir

Standart bir C# projesinde "Referanslar" klasörü vardır, genişletildiğinde, kullanılan tüm kitaplıkları okuyabilir.

Amacım, her projemde çözümümde kullanılan tüm derlemeleri programatik olarak okuyor.

Nihayet derlenmiş * .exe uygulamamın hangi kütüphaneleri kullandığını görmek istiyorum.

cevap

14

Assembly.GetReferencedAssemblies'a baktınız mı?

Kullanılmayan tüm referansların meta verilere yayılmayacaklarını ve bu nedenle bunları yürütme süresinde görmeyeceğinizi unutmayın.

Montajı belirtmek zorunda kalmadan adlandırılmış bir tür bulmak için şimdi GetReferencedAssemblies özyinelemeli olarak kullanıyorum.

1

AppDomain.GetAssemblies'u kullanabilirsiniz.
Ancak bu, uygulamanızda açıkça veya örtülü olarak kullanılan TÜM derlemeler verecektir. Bir Assembly nesne varsa

+2

Bu, zaten yüklenmiş olanlara verecektir.Meta verilerde başvurulanlar olabilir, ancak şu ana kadar uygulamada ihtiyaç duyulmadıkları için henüz yüklenmemiş olabilirler: –

+0

Bahşişiniz için teşekkürler! Bu AppDomain.CurrentDomain.GetAssemblies() da ilginçti – Maciej

0

, sen montaj kullanan herhangi başvuruları almak için onun GetReferencedAssemblies() çağırabilir. Şu anda çalışan proje kullanır derlemelerin listesini almak için, kullanabilirsiniz:

System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies() 
0

Kullanabileceğin tahmin:

AssemblyName[] assemblies = this.GetType().Assembly.GetReferencedAssemblies(); 
3
System.Reflection.Assembly []ar=AppDomain.CurrentDomain.GetAssemblies(); 

foreach (System.Reflection.Assembly a in ar) 
{ 
Console.WriteLine("{0}", a.FullName); 
} 
9

düzgün Bunu yapmak için, meclisleri yürümek gerekiyor , bağımlılıkları toplayıp ... eğer exe'nin Dll_A'ya ihtiyacı varsa ve Dll_A'nın Dll_B'ye ihtiyacı varsa (exe referansı olmasa bile), exe'nizin de Dll_B'ye ihtiyacı vardır.

Bunu (herhangi bir derlemede) yansıtma yoluyla sorgulayabilirsiniz; o (özellikle, dairesel referanslar karşı korumak için hangi ne yapmak küçük bir iş alır; burada "giriş düzeneği" başlayan bir örnektir, ama bu gibi kolayca herhangi montaj olabilir: Anlıyorum gibi

List<string> refs = new List<string>(); 
    Queue<AssemblyName> pending = new Queue<AssemblyName>(); 
    pending.Enqueue(Assembly.GetEntryAssembly().GetName()); 
    while(pending.Count > 0) 
    { 
     AssemblyName an = pending.Dequeue(); 
     string s = an.ToString(); 
     if(refs.Contains(s)) continue; // done already 
     refs.Add(s); 
     try 
     { 
      Assembly asm = Assembly.Load(an); 
      if(asm != null) 
      { 
       foreach(AssemblyName sub in asm.GetReferencedAssemblies()) 
       { 
        pending.Enqueue(sub); 
       } 
       foreach (Type type in asm.GetTypes()) 
       { 
        foreach (MethodInfo method in type.GetMethods(
         BindingFlags.Static | BindingFlags.Public | 
          BindingFlags.NonPublic)) 
        { 
         DllImportAttribute attrib = (DllImportAttribute) 
          Attribute.GetCustomAttribute(method, 
           typeof(DllImportAttribute)); 
         if (attrib != null && !refs.Contains(attrib.Value)) 
         { 
          refs.Add(attrib.Value); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.Error.WriteLine(ex.Message); 
     } 
    } 
    refs.Sort(); 
    foreach (string name in refs) 
    { 
     Console.WriteLine(name); 
    } 
+0

Bu da PInvoke ile kullanılan yönetilmeyen dll'leri algılayacak mı, yoksa sadece dll'leri yönetir mi? –

+0

Yalnızca Yönetilen dll'leri. P/Invoke m'yi aramak için yansımayı kullanabilirsiniz. e-tablolar - ama biraz farklı yansıma olurdu. –

+0

Bunu nasıl yaparım? Yansıma bilgim sınırlıdır, bana doğru yönde işaret edebilir misiniz? –

İlgili konular