Estoy intentando escanear una asamblea para este tipo de aplicación con una interfaz específica utilizando código similar al siguiente:Cómo prevenir ReflectionTypeLoadException al llamar Assembly.GetTypes()
public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
var matchingTypes = new List<Type>();
var asm = Assembly.LoadFrom(assemblyPath);
foreach (var t in asm.GetTypes())
{
if (typeof(T).IsAssignableFrom(t))
matchingTypes.Add(t);
}
return matchingTypes;
}
Mi problema es que tengo un ReflectionTypeLoadException
al llamar al asm.GetTypes()
en algunos casos, p. ej. si el conjunto contiene tipos que hacen referencia a un conjunto que actualmente no está disponible.
En mi caso, no estoy interesado en los tipos que causan el problema. Los tipos que estoy buscando no necesitan los ensamblajes no disponibles.
La pregunta es: ¿es posible omitir/ignorar de algún modo los tipos que causan la excepción pero aún procesar los otros tipos contenidos en el ensamblaje?
Puede ser una reescritura mucho mayor de lo que está buscando, pero MEF le ofrece una funcionalidad similar. Simplemente marque cada una de sus clases con una etiqueta [Exportar] que especifique la interfaz que implementa. Luego puede importar solo aquellas interfaces que le interesen en ese momento. –
@Drew, gracias por tu comentario. Estaba pensando en usar MEF, pero quería ver si hay otra solución más barata. – M4N
Dando a la fábrica de clases de plugins un nombre conocido para que pueda simplemente usar Activator.CreateInstance() directamente es una solución simple. Sin embargo, si obtiene esta excepción ahora debido a un problema de resolución de ensamblaje, es probable que también la obtenga más tarde. –