Запретить Assembly.GetTypes () загружать зависимости - PullRequest
1 голос
/ 07 февраля 2012

У меня есть сборка A, ссылающаяся на сборку B. Они расположены в одном каталоге.

Type[] types = null;
try
{
  Assembly a = Assembly.Load("A.dll");
  types = a.GetTypes(); // loads B implicitly.
}
catch(ReflectionTypeLoadException ex)
{
  types = ex.Types.Where(x=>x!=null);
}

Как я могу предотвратить загрузку B? Я хочу, чтобы GetTypes () запускался так, как если бы B не был доступен, и возвращал только доступные типы и нули для недоступных, чтобы я мог выполнить ex.Types.where(x=>x!=null);

Я хочу использовать трюк из Как предотвратить ReflectionTypeLoadException при вызове Assembly.GetTypes ()

Таким образом, я могу получать только типы, которые не зависят от B, и работать с ними.

Обновление:

Я загрузил A как в отражении, так и в обычном контексте. Я использовал контекст отражения A для вызова GetTypes (). После получения типов из сборки контекста отражения у меня возникла другая проблема. Когда я вызвал Type.GetCustomAttributes (), я получил следующее исключение

Недопустимо отражать пользовательские атрибуты типа, загружаемого через ReflectionOnlyGetType (см. Assembly.ReflectionOnly) - использовать Вместо этого CustomAttributeData.

Я решил это, получив тот же тип из обычной контекстной сборки.

//... code omited for brevity
Type reflectionType = reflectionAssembly.GetTypes()[0];
//... code omited for brevity
Type goodType = normalAssembly.GetType(reflectionType.FullName);

Таким образом, я предотвращал загрузку B и использовал типы из A независимо от B.

1 Ответ

3 голосов
/ 07 февраля 2012

посмотрите на использование Assembly.ReflectionOnlyLoad(), которое ищет не загружать зависимости.не уверен, что он будет возвращать типы, которые ссылаются на эту зависимость или нет, как я не пытался сделать это раньше.

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