es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Es posible recargar una DLL utilizando pythonnet?

Estoy ejecutando:
* python 3.7.9 (64-bit)
* pythonnet 2.4.0

… y tengo el siguiente problema: Tengo un montón de DLL, todas las cuales implementan la misma interfaz. Quiero cargarlas, ejecutar algún código y luego descargarlas. ¿Es posible “recargar” una DLL usando pythonnet? ¿Necesito volver a cargar el módulo también?

def iterate_dlls():
    dll_paths = [
        'RutaDLL1\\NombreDLL.dll',
        'RutaDLL2\\NombreDLL.dll',
    ]

    for dll_path in dll_paths:
        dir_path, dll_name = os.path.split(dll_path)
        sys.path.append(dir_path)
        clr.AddReference("NombreEnsamblado")

        import NombreEnsamblado

        # Uso del ensamblado

        sys.path.remove(dir_path)

        #
        # ¿Qué más se necesita para descargar completamente la DLL aquí?
        #
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para descargar completamente una DLL, puedes utilizar el método clr.FreeLibrary proporcionado por pythonnet. Este método se utiliza para descargar los ensamblados dependientes que fueron cargados a través de clr.AddReference.

    Puedes llamar a clr.FreeLibrary después de haber terminado de utilizar el ensamblado de la siguiente manera:

    import clr
    clr.AddReference("NombreDelEnsamblado")
    import NombreDelEnsamblado
    
    # Uso del ensamblado
    
    clr.FreeLibrary(NombreDelEnsamblado._handle)
    

    Ten en cuenta que debes pasar el atributo _handle del ensamblado a clr.FreeLibrary.

    En cuanto al problema de volver a cargar DLLs utilizando pythonnet, no es posible volver a cargar una DLL que ya ha sido cargada utilizando clr.AddReference. Esto se debe a que clr.AddReference carga el ensamblado solo una vez, aunque se llame varias veces con el mismo nombre de ensamblado.

    Si deseas volver a cargar un ensamblado, necesitas utilizar un AppDomain o proceso diferente. Sin embargo, esto está fuera del alcance de esta respuesta.

Comments are closed.