¿Es posible crear una instancia de un objeto en tiempo de ejecución si solo tengo el nombre de la DLL y el nombre de la clase, sin agregar una referencia al ensamblado en el proyecto? La clase implementa una interfaz, así que una vez que instancia la clase, la lanzaré a la interfaz.
Nombre de la asamblea:
library.dll
Escribe un nombre:
Company.Project.Classname
EDITAR: no tengo la ruta absoluta de la DLL, por Assembly.LoadFile
lo que no funcionará. La DLL puede estar en la raíz de la aplicación, system32 o incluso cargada en el GAC.
fuente
Type type = assembly.GetType("MyNamespace"+"."+"MyType");
Considere las limitaciones de los diferentes
Load*
métodos. De los documentos de MSDN ...Puede encontrar más información sobre Contextos de carga en el
LoadFrom
documentos.fuente
Activator.CreateInstance debería funcionar.
Nota: El nombre del tipo debe ser el tipo totalmente calificado.
Ejemplo:
fuente
TypeName
debe estar completamente calificado. Tuve que llamar a esto como:Activator.CreateInstance("MyAssembly","MyAssembly.TypeName")
Y eso devuelve unObjectHandle
. Para acceder a su interfaz, debe hacerloObjectHandle.UnWrap()
Encontré esta pregunta y algunas respuestas muy útiles, sin embargo, tuve problemas de ruta, por lo que esta respuesta cubriría la carga de la biblioteca al encontrar la ruta del directorio bin.
Primera solución
Segunda solución
Puede usar el mismo principio para las interfaces (estaría creando una clase pero enviando a la interfaz), como:
Este ejemplo es para la aplicación web, pero podría usarse similar para la aplicación de escritorio, solo la ruta se resuelve de manera diferente, por ejemplo
fuente
Es fácil.
Ejemplo de MSDN:
Aquí hay un enlace de referencia
https://msdn.microsoft.com/en-us/library/25y1ya39.aspx
fuente
A partir de Framework v4.5, puede usar Activator.CreateInstanceFrom () para instanciar clases fácilmente dentro de ensamblajes. El siguiente ejemplo muestra cómo usarlo y cómo llamar a un método pasando parámetros y obteniendo el valor de retorno.
fuente
Si. No tengo ningún ejemplo que haya hecho personalmente disponible en este momento. Publicaré más tarde cuando encuentre alguno. Básicamente, usará la reflexión para cargar el ensamblaje y luego extraer los tipos que necesite para él.
Mientras tanto, este enlace debería ayudarlo a comenzar:
Uso de la reflexión para cargar ensamblados sin referencia en tiempo de ejecución
fuente
fuente
Puede cargar un ensamblaje utilizando los métodos * Assembly.Load **. Usando Activator.CreateInstance puede crear nuevas instancias del tipo que desee. Tenga en cuenta que debe usar el nombre de tipo completo de la clase que desea cargar (por ejemplo, Namespace.SubNamespace.ClassName ). Usando el método InvokeMember del Tipo clase puede invocar métodos en el tipo.
Además, tenga en cuenta que una vez cargado, un ensamblado no se puede descargar hasta que también se descargue todo el dominio de aplicación (esto es básicamente una pérdida de memoria).
fuente
Dependiendo de cuán intrínseco sea este tipo de funcionalidad para su proyecto, es posible que desee considerar algo como MEF, que se encargará de cargar y unir los componentes por usted.
fuente
De esta manera, puede usar funciones que no sean para obtener información sobre métodos y luego invocarla. Hará como esta instanciaOfMyType.MethodName (); Pero no puede usar Intellisense porque los tipos dinámicos se escriben en tiempo de ejecución, no en tiempo de compilación.
fuente
Sí, es conveniente utilizar el método de carga estática en la clase de ensamblaje, y luego llamar y luego llamar al método CreateInstance en la instancia de ensamblado que le devolvió la llamada a Load.
Además, puede llamar a uno de los otros métodos estáticos que comienzan con "Cargar" en la clase Ensamblaje, según sus necesidades.
fuente
Puedes hacer esto de esta manera:
fuente