C #: список всех классов в сборке

103

Я хочу вывести (программно - C #) список всех классов в моей сборке.

Любые подсказки или пример кода, как это сделать? Отражение?

Alex
источник
Если вы намерены изучить сборку, на которую не ссылается ваш проект, см. Мой обновленный ответ.
Thorarin

Ответы:

152

Используйте Assembly.GetTypes. Например:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}
Джон Скит
источник
1
Есть предложения для больших сборок? Когда я запускаю этот код для сборки размером 13,8 МБ, мой экземпляр VS зависает на неопределенное время. Я попробовал небольшую сборку размером 9 КБ, и она сработала нормально. Я знаю, о чем вы думаете - почему у вас сборка размером 13,8 МБ - это часть моего уровня данных, созданного с использованием шаблона NetTeirs. У нас много таблиц.
dyslexicanaboko
1
@dyslexicanaboko: Что ж, если у вас много типов, то потребуется много времени, чтобы их все перечислить. Сколько видов находятся в сборке , хотя? И что ты с ними делаешь? (Вы уверены, что проблема в извлечении типов или просто в том, что вы делаете потом?)
Джон Скит
Я не могу обойти вызов asm.GetTypes (), он просто зависает - я имею в виду, очевидно, что существует много типов - я ничего не могу сделать, потому что он пытается получить их все . Мой процессор загружается до 30% на одном из моих 4 ядер. Я имею в виду, что на самом деле мне просто интересно, есть ли способ сказать: «Эй, смотрите только в ЭТО пространство имен» - у меня сложилось впечатление, что это невозможно, потому что метод GetTypes () имеет только пустой конструктор. Я пытаюсь создать своего рода обозреватель объектов.
dyslexicanaboko
1
Хорошая мысль, я еще не пробовал. Моя работа на данный момент заключается в том, чтобы просто настроить таргетинг на классы напрямую, используя asm.GetType (полностьюQualifiedClassName) - это работает, но показать список классов пользователю невозможно, что я и хотел. Это не клиент, кстати, я использую его для себя и других разработчиков.
dyslexicanaboko
1
@DebugErr: Да, достаточно просто сделать это просто классами, если хотите, но я предполагаю, что OP, вероятно, действительно хотел все типы.
Джон Скит,
102

Я просто хотел бы добавить к примеру Джона. Чтобы получить ссылку на собственную сборку, вы можете использовать:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection пространство имен.

Если вы хотите изучить сборку, на которую у вас нет ссылки, вы можете использовать любое из них:

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

Если вы собираетесь создать экземпляр своего типа после того, как найдете его:

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

См. Документацию класса Assembly для получения дополнительной информации.

Если у вас есть ссылка на Assemblyобъект, вы можете использовать, assembly.GetTypes()как уже продемонстрировал Джон.

Торарин
источник
Как я могу ссылаться на совершенно другую сборку, которая есть в моем решении?
Alex
13
Самый простой способ - использовать typeofтип, который, как вы знаете, находится в этой сборке, а затем Assemblyсвойство, как в моем примере.
Джон Скит,
2
Если вы хотите сослаться на сборку, скажем abc.dll, которая есть в вашем решении, и если вы в порядке, жестко запрограммировав имя dll, другой подход к ссылке на сборку: `Assembly assembly = Assembly.Load (" abc ");
Kash
Загружает только текущую сборку. У меня есть приложение или exe с использованием 4 DLL или проектов. Как я могу получить имена классов этих dll?
Эр Маянк
@JonSkeet Как этого добиться в «современной» среде C #? Например, при разработке UWP. UWP не имеет метода GetExecutingAssembly ().
Дэниел Армстронг,