Почему Assembly.GetTypes () требует ссылки? - PullRequest
4 голосов
/ 10 ноября 2011

Я хочу получить все типы из моей сборки, но у меня нет ссылок, и я не забочусь о них.Какое отношение имеет поиск типов интерфейсов к ссылкам?и есть ли способ для меня, чтобы обойти это?

Assembly assembly = Assembly.LoadFrom(myAssemblyPath);
Type[] typeArray = assembly.GetTypes();

Броски: FileNotFoundException Не удалось загрузить файл или сборку «Некоторая ссылка на сборку» или одну из ее зависимостей.Система не может найти указанный файл.

Ответы [ 4 ]

4 голосов
/ 10 ноября 2011

Загрузка сборки требует также загрузки всех ее зависимостей, поскольку код из сборки может быть выполнен после загрузки (не имеет значения, что вы на самом деле ничего не запускаете, а только размышляете над этим).

Чтобы загрузить сборку для явной цели отражения на ней, вам необходимо загрузить ее в контекст только для отражения , например, ReflectionOnlyLoadFrom.Это также не требует загрузки каких-либо ссылочных сборок, но тогда вы не сможете запустить код, и отражение становится немного более неловким, чем то, к чему вы привыкли.

1 голос
/ 12 февраля 2014

Кажется, что это дубликат Получить типы, определенные только в сборке , где решение:

public static Type[] GetTypesLoaded(Assembly assembly)
{
    Type[] types;
    try
    {
        types = assembly.GetTypes();
    }
    catch (ReflectionTypeLoadException e)
    {
        types = e.Types.Where(t => t != null).ToArray();
    }

    return types;    
}
0 голосов
/ 04 марта 2015

Альтернативой использованию контекста только для отражения может быть Mono.Cecil от Jb Evain, который также доступен через NuGet .

ModuleDefinition module = ModuleDefinition.ReadModule(myAssemblyPath);
Collection<TypeDefinition> types = module.Types;
0 голосов
/ 10 ноября 2011

Чтобы загрузить сборку, необходимо загрузить зависимости сборки. Если, например, ваша сборка содержит тип, который возвращает XmlNode, вам придется загрузить System.Xml.dll

...