Bagaimana cara mencantumkan semua rakitan yang dimuat?

101

Dalam .Net, saya ingin menghitung semua rakitan yang dimuat di semua AppDomains. Melakukannya untuk AppDomain program saya cukup mudah AppDomain.CurrentDomain.GetAssemblies(). Apakah saya perlu mengakses setiap AppDomain? Atau apakah sudah ada alat yang melakukan ini?

Abtin Forouzandeh
sumber
1
Perhatikan itu GetAssemblies()tidak akan berhasil, karena tidak rekursif dan itu akan kehilangan referensi perakitan bersarang. Saya telah menambahkan versi rekursif GetAssemblies()di stackoverflow.com/questions/383686/… .
Contango
@Contango: AppDomain.CurrentDomain.GetAssemblies()baik-baik saja. Itu tidak perlu menjalankan referensi secara rekursif, karena itu tidak menghitung referensi di tempat pertama.
Ben Voigt
Apakah ini menjawab pertanyaan Anda? Bagaimana Anda melakukan loop melalui rakitan yang saat ini dimuat?
UuDdLrLrSs

Jawaban:

95

Menggunakan Visual Studio

  1. Lampirkan debugger ke proses (misalnya mulai dengan debugging atau Debug> Lampirkan ke proses)
  2. Saat debugging, tampilkan jendela Modules (Debug> Windows> Modules)

Ini memberikan detail tentang setiap assembly, domain aplikasi dan memiliki beberapa opsi untuk memuat simbol (mis. File pdb yang berisi informasi debug).

masukkan deskripsi gambar di sini

Menggunakan Process Explorer

Jika Anda menginginkan alat eksternal, Anda dapat menggunakan Process Explorer (freeware, diterbitkan oleh Microsoft)

Klik pada proses dan itu akan menampilkan daftar dengan semua majelis yang digunakan. Alat ini cukup bagus karena menampilkan informasi lain seperti pegangan file dll.

Secara terprogram

Periksa pertanyaan SO ini yang menjelaskan bagaimana melakukannya.

Bogdan Gavril MSFT
sumber
1
Ini bahkan lebih baik daripada yang dijelaskan di sini, karena di halaman properti untuk suatu proses, Process Explorer menunjukkan dengan tepat rakitan AppDomain (termasuk 'Shared Domain') mana yang dimuat. Jadi ini menunjukkan lebih dari sekedar .dll yang dimuat ke dalam proses. Alangkah baiknya mengetahui API apa yang mereka gunakan untuk menunjukkan ini (link 'Programmatically' tentang hanya akan memberikan Assemblies di CurrentDomain).
Govert
22

Inilah yang akhirnya saya dapatkan. Ini adalah daftar semua properti dan metode, dan saya mencantumkan semua parameter untuk setiap metode. Saya tidak berhasil mendapatkan semua nilai.

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>");
                    }
                }
            }
        }
s15199d
sumber
btw ... Saya mengecualikannya dari posting awal, tetapi saya memfilter beberapa tanggapan seperti begituforeach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d
2
Ini sama sekali tidak menjawab pertanyaan itu.
Govert
Alih-alih menggunakan GetExecutingAssembly (), saya menggunakan GetEntryAssembly () untuk memastikan saya mendapatkan daftar Assemblies yang lebih baik yang digunakan oleh program saya. Jika ExecutingAssembly merupakan DLL, saya akan melewatkan beberapa di antaranya.
Harry Glinos
6
coba gunakan: Assembly [] assemblies = AppDomain.CurrentDomain.GetAssemblies ();
DanW