2009-06-30 1 views
3

Ich verwende Powershell, um einen COM-Objektmethodenaufruf zu testen. Aufgrund des schlechten Designs/Kodierung/alles hängt diese COM-Objekt-Methode einfach, wenn sie fehlerhaft ist. Mein Standard-Instinkt ist es, + c zu kontrollieren, aber das funktioniert nicht. Muss ich Powershell töten, um einen gehangenen COM-Methodenaufruf zu beenden?Gibt es eine Möglichkeit, einen angehaltenen Prozess in Powershell zu beenden?

Vielen Dank im Voraus.

Antwort

6

Rufen Sie eine Methode für ein COM-Objekt auf, das sich im Adressraum des PowerShell-Prozesses befindet? Wenn ja, dann müssen Sie PowerShell beenden, um den Anruf aufzuheben.

EDIT Matthew fragte, ob AppDomains verwendet werden könnte, um dieses Problem zu beheben.

Leider nein kann es nicht. Der Schlüssel hier ist, dass das COM-Objekt nativen Code ausführt. Das bedeutet, dass an dem Punkt, an dem das COM-Objekt hängt, der Thread in systemeigenem Code ist. Mit verwaltetem Code können Sie einen Thread im systemeigenen Code nicht entfernen. Auch Aufrufe von .Abort() werden erst wirksam, wenn der Thread zum verwalteten Code zurückkehrt.

+0

Nicht genau, was Sie meinen, aber ich denke, die Antwort ist ja. Ich habe das Objekt in PS mit "new-object -Com" instanziiert. –

+0

Gilt das für den Prozess oder könnte er eine AppDomain für die Isolierung verwenden? –

+0

@Matthew ja, ich fügte einen detaillierten Grund, warum zu meiner Antwort – JaredPar

1

Der einfache Weg für mich ist pskill zu verwenden.

+0

Das wird in diesem Fall nicht funktionieren. Der Prozess, der hängt, ist PowerShell, weil es einen Aufruf an ein inproc COM-Objekt aufruft, das hängt – JaredPar

+0

Yeah - ich sah Ihre Antwort und den OP-Kommentar, nachdem ich gepostet habe. –

0

können Sie versuchen:

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($obj) 

oder Rohr den Prozess zu Prozess-Stop-und fügte hinzu -Force auch helfen könnte.