Tengo una solución .NET 2.0 Win Forms existente que se implementa en el cliente. En aras de este escenario, vamos a llamarlo 'WinApp.exe'. WinApp.exe tiene una referencia directa a un ensamblado privado llamado 'Assembly.dll'. Assembly.dll tiene una referencia directa a otro ensamblado llamado 'Framework.dll'. Dentro de Framework.dll se encuentra un tipo llamado 'IPlugIn'. Framework.dll no tiene un nombre seguro, pero la versión del ensamblado es 1.0. Hay una clase en Assembly.dll que implementa IPlugIn desde Framework.dll.Problema al crear instancias de tipo utilizando la reflexión del ensamblado de nombre seguro
Tengo otra solución .NET 2.0 Win Forms llamada 'Framework.exe'. Este proyecto de Win Forms también tiene una referencia directa a Framework.dll, que tiene definido el tipo 'IPlugIn'. Framework.dll no tiene un nombre seguro, pero la versión de este ensamblado es 2.0. Poco a poco, 'IPlugIn' en Framework.dll v2 es idéntico a 'IPlugIn' en Framework.dll v1. El código en Framework.exe utiliza la reflexión para cargar la aplicación de IPlugIn que está en WinApp:
AssemblyName an = AssemblyName.GetAssemblyName("C:\\Program Files\\WinApp\\Assembly.dll");
Assembly dll = Assembly.Load(an);
object o = Activator.CreateInstance(dll.GetType("WinApp.ClassThatImplementsIPlugIn"));
IPlugIn iPlugIn = o as IPlugIn;
Hasta ahora, todo bien. Este código funciona! Ahora aquí está la parte problemática. Necesito asignar un nombre seguro a Framework.dll v2, para que pueda colocarse en el GAC. Sin embargo, WinApp y sus ensamblajes dependientes no se volverán a implementar; debe continuar utilizando las mismas versiones de ensamblados que está utilizando actualmente. Cuando doy Framework.dll v2 un nombre fuerte y volver a compilar y ejecutar Framework.exe, cuando se ejecuta el código anterior recibo una "InvalidCastException" en línea:
IPlugIn iPlugIn = o as IPlugIn;
Creo que estoy recibiendo esta excepción porque ahora que una versión de Framework.dll tiene un nombre fuerte, el tiempo de ejecución trata el tipo "IPlugIn" como si fuera un tipo completamente diferente. Necesito saber si hay alguna manera de resolver este problema. De nuevo, los requisitos son:
- Debo poder poner Framework.dll v2 en el GAC (por lo tanto, debe tener un nombre seguro).
- WinApp debe continuar funcionando como lo hace actualmente (continúe haciendo referencia a Framework.dll v1). No puedo redistribuir ensamblados recién compilados para WinApp.
¡Gracias de antemano!
Chad
"Un método para seguir utilizando la clase será utilizar la reflexión, pero esto podría ser muy útil cuando entren en juego más tipos alojados en Framework. Se necesitará acceder a todos mediante la reflexión". No estoy seguro de entender esa declaración. ¿Puedes proporcionar un código de muestra para explicar lo que eso significa? –
@Chad Ernst - He agregado un código de ejemplo para usted –
Peter - ¡Gracias! –