Игнорировать недостающие зависимости во время 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 и запросить окончательное подтверждение.:)