C #: Assembly'deki Tüm Sınıfları Listele


103

Derlememdeki tüm sınıfların bir listesini (programlı olarak - C #) çıkarmak istiyorum.

Bunun nasıl yapılacağı konusunda herhangi bir ipucu veya örnek kod var mı? Yansıma?


Niyetiniz projeniz tarafından referans alınmayan bir montajı incelemekse, güncellenmiş cevabıma bakın.
Thorarin

Yanıtlar:


152

Kullanın Assembly.GetTypes. Örneğin:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}

1
Büyük montajlar için herhangi bir öneriniz var mı? Bu kodu 13,8 MB'lik bir derleme için çalıştırdığımda, VS örneğim süresiz olarak nasıl hissettirdiği için kilitleniyor. Küçük bir 9 KB derlemesi denedim ve gayet iyi çalıştı. Ne düşündüğünüzü biliyorum - neden 13,8 MB'lik bir derlemeniz var - bu bir NetTeirs şablonu kullanılarak oluşturulan veri katmanımın bir parçası. Çok masamız var.
dyslexicanaboko

1
@dyslexicanaboko: Pek çok türünüz varsa, hepsini sıralamak uzun zaman alacak. Montajınızda kaç tip var ? Ve onlarla ne yapıyorsun? (Sorunun türleri çıkarmaktan mı yoksa daha sonra ne yapmakta olduğunuzdan emin misiniz?)
Jon Skeet

Asm.GetTypes () çağrısını geçemiyorum, sadece askıda kalıyor - yani açıkçası pek çok Tür olduğu gerçeğidir - hiçbir şey yapamıyorum çünkü hepsini elde etmeye çalışmaktan uzaklaşıyor . CPU'm 4 çekirdeğimden birinde% 30'a kadar çekim yapıyor. Demek istediğim, "Hey - sadece BU ad alanına bak" demenin bir yolu olup olmadığını merak ediyorum - GetTypes () yönteminde yalnızca boş bir kurucu olduğu için bunun mümkün olmadığı izlenimine kapılıyorum. Bir tür nesne tarayıcısı yapmaya çalışıyorum.
dyslexicanaboko

1
İyi nokta, bunu henüz denemedim. Şimdilik çalışmam, sınıfları doğrudan asm.GetType (fullQualifiedClassName) kullanarak hedeflemektir - bu işe yarıyor, ancak kullanıcıya sınıfların bir listesini göstermek mümkün değil, istediğim de bu. Bu, müşteriye dönük BTW değil, ben ve diğer geliştiriciler için dahili olarak kullanıyorum.
dyslexicanaboko

1
@DebugErr: Evet - isterseniz onu sadece sınıflar haline getirmek yeterince kolay , ama benim tahminim OP muhtemelen tüm türleri gerçekten istedi.
Jon Skeet

102

Ben sadece Jon'un örneğini eklemek istiyorum. Kendi montajınıza referans almak için şunları kullanabilirsiniz:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection ad alanı.

Referansınız olmayan bir montajı incelemek istiyorsanız, şunlardan birini kullanabilirsiniz:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

Türünüzü bulduktan sonra somutlaştırmayı düşünüyorsanız:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

Daha fazla bilgi için Assembly sınıfı belgelerine bakın .

AssemblyNesnenin referansına sahip olduğunuzda, assembly.GetTypes()Jon'un daha önce gösterdiği gibi kullanabilirsiniz .


Çözümümdeki tamamen farklı bir montaja nasıl başvurabilirim?
Alex

13
En kolay yol, typeofbenim örneğimde olduğu gibi, o montajda olduğunu bildiğiniz bir türle ve ardından Assemblymülkle kullanmaktır.
Jon Skeet

2
Bir derlemeye başvurmak istiyorsanız, örneğin çözümünüzdeki abc.dll ve dll adını sabit kodlamanız varsa, derlemeye başvurmak için başka bir yaklaşım şudur: `Assembly assembly = Assembly.Load (" abc ");"
Kash

Yalnızca mevcut montajı yükler. 4 dll veya proje kullanan bir uygulama veya exe var. Bu dll'lerin sınıf adlarını nasıl alabilirim?
Er Mayank

@JonSkeet "Modern" bir c # ortamında buna nasıl ulaşılabilir? UWP geliştirme yaparken olduğu gibi. UWP, GetExecutingAssembly () yöntemine sahip değil.
Daniel Armstrong
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.