Как получить список классов в .NET

2

Я пробовал Assembly.ReflectionOnlyLoadFrom(@"path\System.Core.dll") и ReflectionOnlyLoad, но у меня есть исключения и ошибки. Как правильно получить все пространства имен/классы в сборке?

Например, я получил это исключение.

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
Теги:
reflection

3 ответа

2
Лучший ответ

Если вы можете ссылаться на System.Core, то

    List<string> namespaces = new List<string>();

    var refs = Assembly.GetExecutingAssembly().GetReferencedAssemblies();

    foreach (var rf in refs) {
        if (rf.Name == "System.Core")
        {
            var ass = Assembly.Load(rf);
            foreach (var tp in ass.GetTypes())
            {
                if (!namespaces.Contains(tp.Namespace))
                {
                    namespaces.Add(tp.Namespace);
                    Console.WriteLine(tp.Namespace);
                }
            }
        }
    }

Если вы не можете, вам нужно будет прикрепить к событию AssemblyResolve CurrentDomain и загрузить все сборки типов, которые использует System.Core.dll при загрузке dll.

3

Чтобы загрузить сборку, а затем получить список всех типов:

Assembly assembly = Assembly.ReflectionOnlyLoadFrom("System.Core.dll");
Type[] types = assembly.GetTypes();

К сожалению, это вызовет исключение, если какой-либо из открытых типов не может быть загружен, и иногда этого отказа нагрузки нельзя избежать. В этом случае, однако, исключенное исключение содержит список всех типов, которые были успешно загружены, и поэтому мы можем просто сделать это:

Assembly assembly = Assembly.ReflectionOnlyLoadFrom("System.Core.dll");

Type[] types;
try
{
    types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
    types = ex.Types;
}

Это даст вам список всех типов, включая интерфейсы, структуры, перечисления и т.д. (если вам нужны только классы, вы можете отфильтровать этот список).

1

Вот ваш ответ на ваш вопрос. Мне не нужно копировать и вставлять его здесь для вас, это может быть greener, чтобы сэкономить место, а не копировать код из другого потока.: -)

  • 0
    кажется, у него проблемы с загрузкой сборки, не перечисляя типы ...
  • 0
    Вы читали ветку? Попробуйте прокрутить вниз, и вы увидите свой ответ там.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню