elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Eliminar dll que estoy usando
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Eliminar dll que estoy usando  (Leído 3,052 veces)
El Benjo


Desconectado Desconectado

Mensajes: 392



Ver Perfil WWW
Eliminar dll que estoy usando
« en: 5 Agosto 2015, 09:31 am »

Hola, buen día. Actualmente estoy trabajando en un proyecto donde importo un ensamblado y hago una instancia de una clase definida en ese ensamblado. La cuestión es que tengo un botón cuya acción es borrar el archivo de dicha dll, sin embargo el método File.Delete() me arroja una excepción de tipo UnauthorizedAccessException. He intentado eliminar la instancia que tengo de dicha clase dentro del ensamblado, pero al parecer esto no es suficiente. ¿Cómo puedo hacerlo, si es que puedo?


« Última modificación: 6 Agosto 2015, 23:16 pm por El Benjo » En línea

www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Eliminar dll que estoy usando
« Respuesta #1 en: 5 Agosto 2015, 16:18 pm »

Por mucho que liberes/finalices la instancia de la class, seguirá existiendo la instancia del archivo (la carga en memoria), por lo que el archivo seguirá estando "en uso".

Como nos indica la documentación en la MSDN, un ensamblado referenciado se carga al inicio de la app y su tiempo de vida es el mismo que el de la app, así que teoricamente no se puede liberar el ensamblado, a menos que liberes el AppDomain donde se cargó la dll (el entorno donde la app se está ejecutando), lo que viene siendo hasta finalizar la app...

How to: Load and Unload Assemblies (C# and Visual Basic) - MSDN



Se me ocurren dos soluciones viables (al menos).

La primera opción consiste en mover el archivo hacia una carpeta temporal para dejar que Windows lo elimine automaticamente más tarde en la siguiente limpieza del sistema.

Código
  1. ' ClassName = El nombre de la class del ensamblado referenciado.
  2. Dim sourcePath As String = Assembly.GetAssembly(GetType(ClassName)).Location()
  3. Dim targetPath As String = String.Format("{0}.tmp", Path.Combine(Path.GetTempPath, Path.GetFileName(sourcePath)))
  4.  
  5. File.Move(sourcePath, targetPath)

Nota(s):
  • Ten en cuenta que al mover el archivo los handles del archivo permanecerán, el ensamblado seguirá cargado en memoria obviamente, es una eliminación "a largo plazo".
  • En C# usarías la función typeof en lugar de GetType que no está disponible.



La segunda opción sería cargar el ensamblado dinamicamente mediante el uso de Reflection, usando el overload del método Load que toma como parámetro un stream o un array de bytes.

Código
  1. Dim assPath As String = ".\MyAssembly.dll"
  2. Dim ass As Assembly = Assembly.Load(File.ReadAllBytes(assPath))
  3. File.Delete(assPath)
Nota(s):
  • si usases el método LoadFile para cargar un archivo local entonces no podrás eliminar el archivo.
  • Esta última opción requiere mucho más trabajo dependiendo de tus necesidades, de la cantidad de métodos miembros que necesitas localizar y usar mediante Reflection.

Saludos


« Última modificación: 6 Agosto 2015, 09:41 am por Eleкtro » En línea



El Benjo


Desconectado Desconectado

Mensajes: 392



Ver Perfil WWW
Re: Eliminar dll que estoy usando
« Respuesta #2 en: 6 Agosto 2015, 06:49 am »

Hola, Elektro, gracias por responder.

De hecho el proyecto carga un ensamblado en tiempo de ejecución y lo hacía con el método LoadFile() y no Load(). Todavía no pruebo el código porque en base a esta última modificación debo hacer varias modificaciones ya que se modifican algunas propiedades del objeto Assembly que devuelve. Pero en cuanto pruebe el código posteo si se ha solucionado.

De nuevo, muchas gracias, Elektro.
En línea

www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.
El Benjo


Desconectado Desconectado

Mensajes: 392



Ver Perfil WWW
Re: Eliminar dll que estoy usando
« Respuesta #3 en: 6 Agosto 2015, 23:16 pm »

Pues sí, la solución que me has dado con Assembly.Load en vez de Aseembly.LoadFile ha servido. Muchas gracias. :)
En línea

www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines