Cargar archivos DLL en un AppDomain separado


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

Author: Jon Turner, 2008-09-18

5 answers

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 eso funciona correctamente (sin excepciones lanzadas), ahora tiene una instancia de TypeIWantToLoad cargada en su nuevo dominio. La instancia que tiene es en realidad un proxy (ya que el objeto real está en el nuevo dominio), pero puede usarlo como su objeto normal.

Nota: Por lo que sé TypeIWantToLoad tiene que heredar de MarshalByRefObject.

 34
Author: Jon Turner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 14:29:27

Si se dirige a la versión 3.5, puede aprovechar el nuevo marco de extensibilidad administrada para manejar todo el trabajo pesado por usted.

 4
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 23:50:12

Puedes usar el AppDomain .CreateInstance método para hacer esto. Tendrá que llamar al método Unwrap del ObjectHandle que se devuelve para obtener el objeto real.

 2
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 23:46:48

Crea un nuevo AppDomain con AppDomain.Crear( ... ). Después de crear el AppDomain, cargue las DLL en ese AppDomain.

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

 0
Author: Min,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 23:50:47

Como se indicó anteriormente, use AppDomain.CreateDomain para crear un nuevo dominio de aplicación. A continuación, puede cargar un ensamblado utilizando el método Load, o incluso ejecutar un ensamblado utilizando el método ExecuteAssembly. Puede usar GetAssemblies para ver si un ensamblado ya se ha cargado. Tenga en cuenta también que no puede descargar un ensamblado una vez que está cargado. Tendrá que descargar el dominio.

 0
Author: Ty.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 00:27:05