Implementamos un marco de plugin para nuestra aplicación y cargamos ensambles de plugins usando Assembly.Loadfrom. Luego usamos GetTypes() y examinamos los tipos con cada archivo de complemento para las interfaces compatibles.Assembly.GetTypes() - ReflectionTypeLoadException
El usuario proporciona una ruta de acceso a los complementos y recorremos cada uno de los archivos de la carpeta para ver si (el complemento) es compatible con nuestra interfaz de complementos. Si lo hace, creamos una instancia, si no, pasamos al siguiente archivo.
Construimos dos versiones de software a partir de una base de código (appA_1 y appA_2).
La carga de los complementos funciona bien cuando los complementos son cargados por la aplicación que se creó al mismo tiempo que el archivo de complemento. Sin embargo, si construimos appA_2 y apuntemos a la carpeta del complemento de la aplicación A_1, obtenemos una excepción cuando se llama a GetTypes().
Una versión básica de nuestro código es;
var pluginAssembly = Assembly.LoadFrom(FileName);
foreach (var pluginType in pluginAssembly.GetTypes())
{
Recibimos la excepción "ReflectionTypeLoadException".
Esto es preocupante porque queremos que nuestra aplicación sea capaz de cargar los tipos de cualquier complemento, creado por cualquier persona. ¿Hay algo que nos falta?
EDIT: Después de iterar a través de LoaderExceptions, hemos descubierto que hay un solo archivo libPublic.dll que genera una excepción System.IO.FileNotFoundException. Lo extraño es que este archivo reside en el directorio de la aplicación y el complemento está referenciado al archivo del proyecto.
EDIT 2: En el registro de excepciones se encuentran los siguientes "Comparando el nombre de ensamblado como resultado la falta de coincidencia: Número de revisión"
¿Cuál es el mensaje de excepción? ¿La excepción tiene una excepción interna? ¿Cuál es el mensaje de eso? – dtb
¿Alguna razón por la que no está utilizando un marco existente como MEF? – dtb
Aún puede crear problemas como este cuando usa MEF, aunque MEF es definitivamente útil para encargarse del trabajo. –