Pregunta

Quiero cargar una o más DLL dinámicamente para que se ejecuten con una seguridad o ruta base diferente a la de mi aplicación principal.¿Cómo cargo estas DLL en un AppDomain separado y creo instancias de objetos a partir de ellas?

¿Fue útil?

Solución

Más específicamente

AppDomain domain = AppDomain.CreateDomain("New domain name");
//Do other things to the domain like set the security policy

string pathToDll = @"C:\myDll.dll"; //Full path to dll you want to load
Type t = typeof(TypeIWantToLoad);
TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);

Si todo va correctamente (sin excepciones), ahora tiene una instancia de TypeIWantToLoad cargada en su nuevo dominio.La instancia que tienes es en realidad un proxy (ya que el objeto real está en el nuevo dominio), pero puedes usarla como tu objeto normal.

Nota:Hasta donde yo sé, TypeIWantToLoad tiene que heredar de MarshalByRefObject.

Otros consejos

Si su objetivo es 3.5, puede aprovechar la nueva marco de extensibilidad gestionado para encargarse de todo el trabajo pesado por usted.

Puedes usar el Dominio de aplicación.Crear instancia método para hacer esto.Deberá llamar al método Unwrap del ObjectHandle que se devuelve para llegar al objeto real.

Cree un nuevo dominio de aplicación con AppDomain.Create(...).Después de crear el AppDomain, cargue las DLL en ese AppDomain.

Mire todos los métodos que Appdomain tiene con Create*.Hay ciertas cosas como CreateInstanceAndUnwrap, etc.

Como se indicó anteriormente, use AppDomain.CreateDomain para crear un nuevo dominio de aplicación.Luego puede cargar un ensamblaje usando el método Load, o incluso ejecutar un ensamblaje usando el método ExecuteAssembly.Puede utilizar GetAssemblies para ver si ya se ha cargado un ensamblaje.Tenga en cuenta también que no puede descargar un ensamblaje una vez cargado.Deberá descargar el dominio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top