У меня есть сборка 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.