PowerShell-ISE: Beim Schließen einer PowerShell-Registerkarte wird eine dynamisch geladene .NET-Assembly nicht entsperrt

441
Sau

Bitte beachten Sie das folgende Szenario.

  • Starten Sie Windows PowerShell ISE (64 Bit)
  • Erstellen Sie eine neue PowerShell-Registerkarte
  • Erstellen Sie ein neues PS-Skript, das eine benutzerdefinierte Assembly durch Aufrufen von [System.Reflection.Assembly] :: LoadFrom lädt

  • Erstellen Sie eine Instanz eines Objekts aus Ihrer benutzerdefinierten Assembly, indem Sie den Befehl New-Object aufrufen

  • Führen Sie das Skript aus und überprüfen Sie, ob eine Instanz Ihres benutzerdefinierten Objekts erstellt wurde.
  • Schließen Sie die PowerShell-Registerkarte . Lassen Sie jedoch PowerShell ISE weiterlaufen. Ich hätte erwartet, dass PowerShell ISE die Assembly komplett entladen hat.

Die benutzerdefinierte Assembly ist jedoch gesperrt, bis PowerShell ISE vollständig geschlossen wird.

Ich entwickle eine benutzerdefinierte .NET-Bibliothek mit Visual Studio .NET und PowerShell ist eine Clientanwendung dieser Bibliothek. Da beim Schließen des Tabs die Assembly nicht entsperrt wird, muss ich Powershell ISE jedes Mal schließen und erneut starten, wenn ich eine Änderung in Visual Studio vornehme. Dieses Verhalten von PowerShell ISE verkürzt meine Entwicklungszeit drastisch.

Gibt es eine Problemumgehung für dieses Problem?

Laden einer benutzerdefinierten Assembly in ISE durch Reflektion

Danke, Sau

0
Wenn Sie ein Formular laden, sollten Sie überprüfen, ob Sie es entladen haben. Ramhound vor 5 Jahren 0
Hallo @Ramhound, Fügte einfach ein Bild hinzu, um mein Szenario besser zu erklären. Ich bin nicht sicher, ob ich "Entladen" verstehe. Ich erstelle kein Windows Form. Nur eine schlichte C # -Klasse. Ich denke, das Problem würde sich auch dann zeigen, wenn es sich um ein benutzerdefiniertes Windows-Formular handelt, da PowerShell die Assembly in ihre AppDomain geladen hat. Ich hätte erwartet, dass PowerShell die mit der PowerShell-Registerkarte verknüpfte AppDomain entlädt. Sau vor 5 Jahren 0
.NET-Assemblys können nicht entladen werden. Die einzige Möglichkeit, eine Assembly zu entladen, besteht darin, die gesamte AppDomain abzureißen. Daniel B vor 5 Jahren 0
Hallo @DanielB, Danke fürs Kommentieren. Du liegst absolut richtig. Wissen Sie, warum PowerShell beim Schließen eines Tabs die AppDomain nicht herunterreißen würde? Ich denke, das ist ein Fehler. Ich wäre jedoch überrascht, dass Microsoft dieses Problem nicht kennt. Sau vor 5 Jahren 0
PowerShell verwendet keine AppDomains. Sie können den Prozess-Explorer auf der Registerkarte .NET-Assemblies eines Prozesses problemlos überprüfen. Daniel B vor 5 Jahren 0
Hallo @DanielB, Danke fürs Kommentieren. Von der Konsole von ** ISE ** aus habe ich [System.AppDomain] :: CurrentDomain] und dann [[System.Reflection.Assembly] :: LoadFrom] und dann [[System.AppDomain] :: CurrentDomain.GetAssemblies ( ) `was meine Custom Assembly zeigt. Ich werde nicht umstritten sein, ob sich ** PowerShell ISE ** in AppDomains partitioniert. Meiner Meinung nach sollte ** ISE ** die Umgebung neu einstellen. Etwas Ähnliches war in einem älteren Nicht-Microsoft-Produkt ** PowerGUI ** (jetzt eingestellt). Sau vor 5 Jahren 0
Hi @DanielB, habe noch ein paar Experimente gemacht. Erstellen Sie mehrere ** PowerShell ISE ** -Registerkarten, und führen Sie den Befehl [System.AppDomain] :: CurrentDomain] in jeder von ihnen aus. Ich fand, dass in jedem der Tabs die ID der AppDomain identisch war. Dies lässt mich zu dem Schluss kommen, dass ** PowerShell ISE ** sich tatsächlich nicht in ** AppDomains ** partitioniert. Sau vor 5 Jahren 0
AppDomains sind leider sehr schwer zu finden. Ich finde es verständlich, dass Microsoft beschlossen hat, sie nicht in PowerShell ISE zu verwenden. Daniel B vor 5 Jahren 0
Richtig, "New PowerShell Tab" erstellt einen neuen PowerShell-Runspace und keine AppDomain-Klasse. George Chakhidze vor 5 Jahren 0

0 Antworten auf die Frage