Estoy tratando de escanear un ensamblado en busca de tipos que implementen una interfaz específica usando un código similar a este:
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 obtengo un ReflectionTypeLoadException
al llamar asm.GetTypes()
en algunos casos, por ejemplo, si el ensamblado contiene tipos que hacen referencia a un ensamblado que actualmente no está disponible.
En mi caso, no me interesan los tipos que causan el problema. Los tipos que estoy buscando no necesitan los ensamblados no disponibles.
La pregunta es: ¿es posible omitir / ignorar de alguna manera los tipos que causan la excepción pero aún así procesar los otros tipos contenidos en el ensamblaje?
AppDomain.CurrentDomain.GetAssemblies()
, esto funciona en mi máquina pero no en otras máquinas. ¿Por qué diablos algunos ensamblajes de mi ejecutable no se pueden leer / cargar de todos modos?Respuestas:
Una forma bastante desagradable sería:
Sin embargo, definitivamente es molesto tener que hacer esto. Puede utilizar un método de extensión para hacerlo más agradable en el código "cliente":
Es posible que desee mover la
return
declaración fuera del bloque de captura; no estoy muy interesado en que esté allí, pero probablemente sea el código más corto ...fuente
From t As Type In e.Types Where (t IsNot Nothing) AndAlso (t.TypeInitializer IsNot Nothing)
parece funcionar muy bien.Si bien parece que no se puede hacer nada sin recibir la excepción ReflectionTypeLoadException en algún momento, las respuestas anteriores están limitadas en el sentido de que cualquier intento de utilizar los tipos proporcionados por la excepción seguirá dando problemas con el problema original que causó que el tipo no se cargara.
Para superar esto, el siguiente código limita los tipos a los que se encuentran dentro del ensamblado y permite que un predicado restrinja aún más la lista de tipos.
fuente
¿Ha considerado Assembly.ReflectionOnlyLoad ? Teniendo en cuenta lo que intentas hacer, podría ser suficiente.
fuente
En mi caso, el mismo problema fue causado por la presencia de ensamblajes no deseados en la carpeta de la aplicación. Intente borrar la carpeta Bin y reconstruir la aplicación.
fuente