Отражение: Assembly.GetExportedTypes требует присутствия всех сборок - PullRequest
3 голосов
/ 16 марта 2011

Я хочу проанализировать сборки, используя отражение.

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

Хотя на машине присутствуют не все ссылки на сборку, поэтому мне нужно проанализировать их.

Поэтому, когда я звоню GetTypes или GetExportedTypes, выдается FileNotFoundException, сообщая мне, что «ссылка на сборку не может быть загружена».

Это правда, но все же Я хочу знать, какие типы реализованы в этой сборке .

Отражатель может это сделать как угодно. Как это можно сделать?

РЕДАКТИРОВАТЬ: Я только что узнал о Mono.Cecil, делает именно то, что я хочу, простым способом. Однако это внешняя библиотека, а не встроенное решение.

Ответы [ 3 ]

3 голосов
/ 30 июля 2011

У меня была такая же проблема, и я понял это:
Использование Assembly.LoadFrom() вместо Assembly.LoadFile()

Это работает для меня по крайней мере!: -)

Assembly asm;
Type[] types;

asm = Assembly.LoadFile(@"C:\path\assembly.dll");
types = asm.GetTypes() // throws FileNotFoundException.

asm = Assembly.LoadFrom(@"C:\path\assembly.dll");
types = asm.GetTypes() // Works!

Assembly.GetExportedTypes() ведет себя так же, как и выше.

2 голосов
/ 22 марта 2011

Мне нужно сделать то же самое, и после нескольких часов поиска я наткнулся на это .

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

РЕДАКТИРОВАТЬ: Вот фрагмент кода, используемый в указанной ссылке:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(args.Name), AssemblyBuilderAccess.Run);
    _dumbAssemblies.Add(args.Name, ab);

    return ab;
}

private Dictionary<string, AssemblyBuilder> _dumbAssemblies;

То, что он делает, это создает немые сборки для каждой отсутствующей сборки, так что это позволяет избежать выброса FileNotFoundException.

2 голосов
/ 16 марта 2011

CCI может быть достаточно тяжелым для того, что вы хотите, но он может отражать все сборки, не загружая их все: http://cciast.codeplex.com/

...