Игнорировать отсутствующие зависимости во время ReflectionOnlyLoad - PullRequest
17 голосов
/ 27 августа 2009

Я работаю над простым диалогом браузера классов, который позволяет пользователям открывать сборку и выбирать статический метод изнутри. Однако в некоторых ситуациях зависимости сборки отсутствуют.

Поскольку мне нужно только имя метода, а не его полный прототип, есть ли способ обойти исключение FileNotFoundException, которое возникает при вызове Assembly.ReflectionOnlyLoadFrom ? В настоящее время я обрабатываю AppDomain.ReflectionOnlyAssemblyResolve , но если я возвращаю значение null, я получаю исключение FileLoadException со следующим сообщением:

Невозможно разрешить зависимость от сборки '...', поскольку она не была предварительно загружена. При использовании API ReflectionOnly зависимые сборки должны быть предварительно загружены или загружены по требованию через событие ReflectionOnlyAssemblyResolve.

Я знаю, что это должно быть как-то возможно, потому что .NET Reflector позволяет пропускать неразрешенные зависимости. Однако я начинаю думать, что, возможно, Reflector анализирует сборки вручную, а не загружает их в CLR и использует стандартное отражение. Возможно, он использует что-то вроде Cecil из проекта Mono.

Ответы [ 3 ]

3 голосов
/ 27 августа 2009

Я бы попробовал Сесил , если вы собираетесь выполнять нетривиальную работу со сборками. Также есть MS CCI . (Я не уверен на 100%, работают ли они с отсутствующими битами, но они, безусловно, являются хорошими инструментами в этом пространстве, и я был бы удивлен, если бы они этого не сделали)

Если вам действительно нужно добраться до металла, вы не сможете побить этот учебник Asmex и пример , который определенно должен либо сработать, либо позволить вам обойти его.

3 голосов
/ 16 декабря 2011

Это игнорирует ваши отсутствующие зависимости:

        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);
        }
1 голос
/ 27 августа 2009

Я полагаю, что Reflector выполняет собственный анализ / загрузку сборок - некоторое время назад я посмотрел на его источник (используя сам Reflector: p) и увидел большое количество классов, связанных со сборкой, которые, похоже, разбираются в массивные древовидная структура.

Вы всегда можете отправить письмо по электронной почте в Red Gate / Rutz Loeder и запросить у них окончательное подтверждение. :)

...