Как получить список классов в .NET - PullRequest
2 голосов
/ 29 апреля 2011

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

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

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Ответы [ 3 ]

3 голосов
/ 29 апреля 2011

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

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;
}

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

2 голосов
/ 29 апреля 2011

Если вы можете сослаться на 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.

1 голос
/ 29 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...