Как отражатель отображает типы при сбое Assembly.GetTypes () из-за отсутствующей сборки, на которую ссылаются - PullRequest
3 голосов
/ 13 ноября 2009

У меня есть поврежденная сборка, которую я хочу отразить, она не сломана плохо, она просто не может найти ссылочную сборку, поэтому она не может выполнить PEVerify. Но .... Assembly.LoadFrom () все равно загрузит его, а GetTypes () сгенерирует ReflectionTypeLoadException, массив .LoaderExceptions показывает мне, какая сборка не может быть найдена. На данный момент я заблокирован.

Тем не менее, отличный маленький инструмент Reflector может пойти дальше и фактически отобразить содержащиеся типы, и изящно обрабатывает проблему отсутствующих ссылок, предоставляя мне всплывающее диалоговое окно для его поиска. У меня такой вопрос: как после того, как GetTypes () завершается с ошибкой, рефлектор все равно может получить типы?

Ответы [ 3 ]

5 голосов
/ 13 ноября 2009

Reflector не использует System.Reflection для анализа сборки.

Я не знаю, какую библиотеку использует Reflector, но вы можете взглянуть на Сесил .

4 голосов
/ 26 августа 2010

Module.GetTypes() сгенерирует это же исключение. Если вы поймаете ReflectionTypeLoadException из вызова Assembly.GetTypes(), это исключение будет иметь свойство «Типы» всех типов, которые оно может загрузить. Те, что он не мог, будут подробно описаны в свойстве list / array с именем LoaderExceptions.

0 голосов
/ 27 ноября 2009

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

Assembly a = Assembly.Load(brockenAssembly);

Module[] mList = a.GetModules();

for (int i = 0; i < mList.length; i++)
{
     Module m = a.GetModules()[i];
     Type[] tList = m.GetTypes();

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...