¿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í?
#
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 declr.AddReference
.Puedes llamar a
clr.FreeLibrary
después de haber terminado de utilizar el ensamblado de la siguiente manera:Ten en cuenta que debes pasar el atributo
_handle
del ensamblado aclr.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 queclr.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.