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
Respuesta
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.
Muchas gracias, ¡eso es genial! – abatishchev
+1 para la explicación completa – Laguna
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.
¿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 ... –
@liortal ¿La respuesta aceptada a esta pregunta hace lo que debe hacer? – Andy
Nos gustaría cargar un conjunto de archivos DLL en otro AppDomain, sin embargo, no conocemos los tipos definidos en estos archivos DLL. –
Si se está orientando a 3.5, puede aprovechar la nueva managed extensibility framework para encargarse de todo el trabajo pesado por usted.
@Will: objetivos de MEF .Net 4.0: http://www.codeplex.com/MEF – IAbstract
@ 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
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
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.
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.
- 1. MEF cargando archivos DLL que requirieron archivos DLL en el GAC
- 2. Cargando dinámicamente un archivo DLL
- 3. Powershell dll cargando
- 4. Cargando un ensamblado y aplicando un predicado sobre sus tipos en otro dominio de aplicación
- 5. Podríamos tener 2 archivos DLL con el mismo nombre que se está cargando en un proceso
- 6. Cargando Properties.Settings de un archivo diferente en tiempo de ejecución
- 7. Cargando un ensamblado para .NET 4.5 en un dominio de aplicación .NET 4.0
- 8. Cargando DLL en Java - Eclipse - JNI
- 9. HTML5 Ajax a un dominio diferente?
- 10. Cargando archivos en Prolog
- 11. ¿Qué es un dominio de aplicación .NET?
- 12. Cargando archivos TIFF en Android
- 13. Cargando archivos DLL de complemento, "El miembro invocado no es compatible con un ensamblado dinámico".
- 14. ¿Es posible tener un dominio HTTPS diferente en un iFrame, en otro dominio HTTPS?
- 15. Cargando * .so archivos en Websphere
- 16. Cómo configurar WCF en un proyecto dll diferente
- 17. moviendo los archivos de configuración para un dll a la aplicación que llama al dll
- 18. iframe seguro en página no segura en un dominio diferente
- 19. Cargando archivos con ClassLoader
- 20. Usar archivos dll en la aplicación de Android
- 21. Aplicación de iPhone cargando
- 22. Powershell 2.0 Remoting cargando .Net 4.0 dll
- 23. Cargando archivos .eml en javax.mail.Messages
- 24. Cargando DLL no inicializando clases C++ estáticas
- 25. Liberar memoria asignada en una DLL diferente
- 26. Cargando archivos con PhoneGap + iPhone
- 27. C# - Cargando ensamblado .NET en dominio de aplicación independiente para que pueda descargarlo
- 28. Cargando archivos DLL COM nativos en el entorno de 64 bits
- 29. Iframe SSL en y página SSL desde un dominio diferente
- 30. Cargando complementos (DLL) sobre la marcha
¿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
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. –