unregister dll
¿Puedes eliminar un Tipo Agregado en PowerShell nuevamente? (5)
Actualmente estoy escribiendo una biblioteca en C # y estaba usando PowerShell para probarla rápidamente en algunas ocasiones. Sin embargo, esto me impide reconstruir el proyecto ya que PowerShell obviamente todavía tiene la DLL abierta.
¿Hay alguna forma de volver a descargar el archivo DLL después de agregarlo con Add-Type
? La documentación no parece tener pistas sobre eso y el candidato obvio sería Remove-Type
(que no existe, solo hay un comando de todos modos con Type
como sustantivo). Resulta engorroso cerrar PowerShell y hacer todo lo posible para navegar hasta el directorio de compilación y agregar el tipo nuevamente cada vez que quiero reconstruir.
Aquí hay un ejemplo completo que permite ejecutar el comando Add-Type
como un trabajo en segundo plano para que el ensamblaje se descargue una vez que finalice:
# Start-Job will not preserve the working directory, so do it manually
# Other arguments can also be passed to the job this way
$cd = Split-Path $MyInvocation.MyCommand.Path
$jobParams = @{
''cd'' = $cd
}
Start-Job -InputObject $jobParams -ScriptBlock {
cd $Input.cd
Add-Type -Path assembly.dll
} | Receive-Job -Wait -AutoRemoveJob
Receive-Job -Wait
se asegurará de que se reciba la salida del trabajo, ya que de lo contrario se perderá.
Como dicen los otros, este es un comportamiento .NET. Los ensamblados cargados en un AppDomain no se pueden descargar. Solo el AppDomain puede descargarse y powershell usa un solo appdomain. Publiqué un poco sobre esto hace algunos años: http://www.nivot.org/2007/12/07/WhyAppDomainsAreNotAMagicBullet.aspx
Cuando pruebo de esta manera, generalmente mantengo un shell abierto y uso un shell anidado para hacer pruebas. Inicie powershell, cd en la ubicación del contenedor y luego ejecute "powershell" para iniciar el shell anidado (nuevo proceso). "exit" para comenzar nuevamente, y ejecute "powershell" nuevamente.
Encuentro que la forma más sencilla de evitar este problema es ajustar el Add-Type
y el código de prueba dentro de un Start-Job
. Start-Job
creará un proceso en segundo plano y el tipo se cargará allí. Una vez que haya terminado, el proceso desaparecerá y podrá volver a intentarlo.
Aquí hay un ejemplo de cómo se ve:
$job = Start-Job -ScriptBlock {
Add-Type -path ''my.dll''
$myObj = new-object My.MyTestClassName
$result = $myObj.TestMethod
$result
}
Wait-Job $job
Receive-Job $job
La salida del método de prueba se repetirá en la consola.
He estado enfrentando un problema similar. No es posible descargar un tipo / ensamblaje (eso es porque se aplica a .NET framework).
En .NET puede resolverlo si crea un nuevo dominio de aplicación ( System.AppDomain
) y carga el ensamblado en ese dominio. Es posible descargar el dominio de la aplicación y eso descarga todos los dlls también.
Todavía no lo he probado, porque para mí es mucho más simple cerrar una pestaña en la Console y abrir una nueva.
Si su ensamblaje no requiere un contexto vinculante , puede hacer esto:
$bytes = [System.IO.File]::ReadAllBytes("Path_To_Your_Dll.dll")
[System.Reflection.Assembly]::Load($bytes)