2008-09-17 12 views
30

Quiero cargar uno o más archivos DLL de forma dinámica para que se ejecuten con una seguridad o un camino base diferente de mi aplicación principal. ¿Cómo puedo cargar estos archivos DLL en un dominio de aplicación independiente y crear una instancia de los objetos a partir de ellos?Cargando archivos DLL en un dominio de aplicación diferente

+0

¿Posible duplicado de [forma más simple de hacer call de dominio entre aplicaciones?] (Http://stackoverflow.com/questions/6242573/simplest-way-to-make-cross-appdomain-call) – user626528

+0

El contexto de la referencia posible duplicado es diferente. En la pregunta a la que se hace referencia, el objetivo es llamar al código en un Dominio de aplicación no creado por o bajo el control del desarrollador. Esta pregunta es específicamente sobre cargar código en un dominio de aplicación que el desarrollador controla para que puedan modificar las características del dominio de la aplicación. Además, la pregunta a la que se hace referencia tampoco proporciona un ejemplo de código completo sobre cómo cargar dinámicamente una DLL en tiempo de ejecución, que es un componente clave de esta pregunta. –

Respuesta

33

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 lo que va correctamente (no hay excepciones lanzadas) ahora tiene una instancia de TypeIWantToLoad cargado 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: Hasta donde yo sé, TypeIWantToLoad tiene que heredar de MarshalByRefObject.

+0

Muchas gracias, ¡eso es genial! – abatishchev

+0

+1 para la explicación completa – Laguna

2

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

+0

¿Qué sucede si el objeto cuya instancia me gustaría crear está definido en el conjunto que estoy tratando de cargar? No sé cuál es el nombre de este objeto sin cargar primero el conjunto ... –

+0

@liortal ¿La respuesta aceptada a esta pregunta hace lo que debe hacer? – Andy

+0

Nos gustaría cargar un conjunto de archivos DLL en otro AppDomain, sin embargo, no conocemos los tipos definidos en estos archivos DLL. –

4

Si se está orientando a 3.5, puede aprovechar la nueva managed extensibility framework para encargarse de todo el trabajo pesado por usted.

+0

@Will: objetivos de MEF .Net 4.0: http://www.codeplex.com/MEF – IAbstract

+0

@ dboar Bueno, será parte del framework en 4.0, pero AFAIK puede usar la vista previa en 3.5 (la página de descarga dice que han "fusionado los .net 3.5 y los binarios de Silverlight"). – Will

+0

oh, genial ... Nunca fui más allá de la página codeplex inicial porque dicen específicamente .Net 4.0 ... bueno para saberlo ... thx – IAbstract

0

Cree un nuevo Appdomain con AppDomain.Create (...). Después de crear AppDomain, cargue las DLL en ese AppDomain.

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

0

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

Cuestiones relacionadas