Игнорировать недостающие зависимости во время ReflectionOnlyLoad
Я работаю над простым диалоговым окном браузера, который позволяет пользователям открывать сборку и выбирать статический метод изнутри. Однако есть ситуации, когда отсутствуют зависимости сборки.
Так как мне нужно только имя метода, а не его полный прототип, есть ли способ преодолеть исключение FileNotFoundException, которое возникает при вызове Assembly.ReflectionOnlyLoadFrom? В настоящее время я обрабатываю AppDomain.ReflectionOnlyAssemblyResolve, но если я возвращаю значение null, я получаю исключение FileLoadException со следующим сообщением:
Невозможно разрешить зависимость от сборки "...", поскольку она не была предварительно загружена. При использовании API ReflectionOnly зависимые сборки должны быть предварительно загружены или загружены по требованию через событие ReflectionOnlyAssemblyResolve.
Я знаю, что это должно быть возможно, потому что .NET Reflector позволяет пропустить неразрешенные зависимости. Однако я начинаю думать, что, возможно, Reflector анализирует сборки вручную, а не загружает их в CLR и использует стандартное отражение. Возможно, он использует что-то вроде Cecil из проекта Mono.
Ответы
Ответ 1
Я попробую Cecil, если вы собираетесь выполнять нетривиальную работу с сборками. Там также MS CCI. (Я не уверен на 100%, что любая из этих работ с битами отсутствует, но они, безусловно, являются хорошими инструментами в этом пространстве, и я был бы удивлен, если бы они этого не сделали)
Если вам действительно нужно попасть в металл, вы не сможете победить этот учебник и образец Ammex, который должен разрешите вам обойти его.
Ответ 2
Это будет игнорировать ваши недостающие зависимости:
static void Main(string[] args)
{
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
Assembly assembly = Assembly.ReflectionOnlyLoad("foo");
foreach (Type t in assembly.GetTypes())
{
Console.WriteLine(t.FullName);
}
}
static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}
Ответ 3
Я считаю, что Reflector выполняет собственный сбор синтаксического анализа/загрузки - я смотрел на его источник некоторое время назад (используя Reflector сам: p) и видел большое количество связанных с сборкой классов, которые, кажется, анализируются в массивном древовидная структура.
Вы всегда можете отправить сообщение Red Gate/Rutz Loeder и запросить окончательное подтверждение.:)