Powershell Uvolnit Module ... úplně

hlasů
25

Pracuji na ladění projektu PowerShell. Já používám Import-Modulenačíst modul PS z mého C # DLL a vše funguje. Volání Remove-Modulenení plně vyložit modul ačkoli jak DLL je stále uzamčen a nemůže být odstraněn.

Existuje způsob, jak se dostat PSH plně vyložit modulu a uvolnit DLL tak, že mohu zkopírovat přes něj a znovu vložte jej pomocí Import-Modulebez restartování PSH konzoli?

Aktualizace
Pokud tedy zavedení modulu do samostatného AppDomain to stále fungovat jako normální modul? Může někdo poskytnout nějaký příklad?

Položena 26/08/2009 v 23:43
zdroj uživatelem
V jiných jazycích...                            


10 odpovědí

hlasů
20

Tam je řešení. Otevřít další instanci PowerShell:

PS > powershell
PS > [load DLL]
PS > [do work]
PS > exit

Po výjezdu budete přivedl zpět k instanci PowerShell, ze kterého jste provedli tento hovor (za předpokladu, že jste provedli powershellvolání dovnitř a instance PowerShell). Můžete předat v některém z běžných argumentů powershell, takže můžete použít -kódy nebo -file. Např,

PS > powershell -Command '[load DLL]; [do work]' # Executes a command and exits
PS > powershell -Command '.\myscript.ps1 param1 param2' # Executes the script and exits
PS > powershell -File .\myscript.ps1 param1 param2 # Executes a script and exits.

Když PowerShell ukončí, bude to uvolnit zámek na DLL, která vám umožní pokračovat v práci.

To vše bylo provedeno z rozhraní příkazového řádku PowerShell. I nebyly testovány, co se stane, když hodíte powershelluprostřed scénáře, nebo pokud to bude fungovat v rámci ISE. (Mám podezření, že pracuje v rámci ISE). I v případě, pokud nebude fungovat uvnitř skriptu, je to stále užitečný během vývoje.

Upravit:

Dělal nějakou kontrolu. Takže to vypadá, že funguje zevnitř skriptů a ISE, ale je tu háček v ISE. Od ISE, nemůžete číst jakýkoli vstup od uživatele, když jste uvnitř samostatného PowerShell procesu. Pokusíte-li se, skript nebo příkazy zastavit a počkat, ale ne vstupní pole je zobrazeno jako normální, a samozřejmě nelze zadat přímo do výstupního okna v ISE. Takže pokud budete potřebovat, aby výzvu pro vstup ve středu [do work], dotázat se před vypalováním novou instanci PowerShell, a předat ji do práce jako parametr. Nejedná se o problém vůbec, pokud používáte běžný příkazového řádku PowerShell.

Odpovězeno 09/10/2012 v 21:05
zdroj uživatelem

hlasů
16

Ne. Jako PowerShell používá .NET pod ní má stejné požadavky. Nelze uvolnit DLL z .NET AppDomain bez vykládání AppDomain sám. Vzhledem k tomu, PowerShell UI bydlí ve stejném AppDomain to není možné.

Odpovězeno 26/08/2009 v 23:47
zdroj uživatelem

hlasů
6

Vidím několik proveditelné odpovědi tady, ale tady je moje, pro případ, že je to stále problém pro někoho, (a to je docela líný, což je hezké).

Enter-PSSession -localcomputername
[load dlls]
[execute script(s)]
Exit-PSSession

Dlouhý příběh krátký, což vytváří PSSession na místním počítači vytvoří jiný PowerShell relaci, včetně toho, co je považováno za „naložený“, a při ukončení, čistí věci pro vás.

Odpovězeno 09/12/2015 v 19:50
zdroj uživatelem

hlasů
5

Věřím, že to platí i pro PowerShell: .NET světě jediný způsob, jak vyložit je sestava ji nahrát do jiného AppDomain; Jakmile je sestava vloží do AppDomainzůstává načtena po celou dobu životnosti, která AppDomain.


Zde je příklad z vlákno ptát skoro stejnou otázku a ukazuje několik způsobů, jak vytvořit a nahrát modul do nové AppDomain:

http://www.eggheadcafe.com/conversation.aspx?messageid=30789124&threadid=30766269

Odpovězeno 26/08/2009 v 23:47
zdroj uživatelem

hlasů
3

V souvislosti s rozvojem rutinu a problémy s vyložením DLL, existují dva přístupy, které používám.

Za prvé, já rozvíjet ve Visual Studiu a nastavení externí program (PowerShell) načíst svou rutinu. Tímto způsobem moji načte modul při spuštění ladění, a uvolňuje, když jsem Zastavit ladění.

Za druhé, na těch příležitostech, kdy vím, že chci načíst modul, udělat nějakou práci, a zajišťují modul je uvolněn poté, já používám druhou instanci PowerShell. To bylo diskutováno v dalších odpovědích, a pod moje odpověď ukazuje, jak lze povolit tento pracovní postup při použití funkce s aliasem v mém profilu. I změnit řádek, takže můžu mít vizuální připomenutí, že jsem v „rekurzivní okně PowerShell“.

Vytvořte skript ve svém profilu pro spuštění PowerShell

function Start-DebugPowerShell
{
    PowerShell -NoProfile -NoExit -Command {
        function prompt {
            $newPrompt = "$pwd.Path [DEBUG]"
            Write-Host -NoNewline -ForegroundColor Yellow $newPrompt
            return '> '
        }
    }
}
Set-Alias -Name sdp -Value Start-DebugPowerShell

Upravit nastavení ladění pro svůj projekt rutinu

Spuštění externího programu :

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Argumenty příkazové řádky :

-NoProfile -NoExit -Command "Import-Module .\MyCoolCmdlet.dll"

Ladění modul

Právě z Visual Studio spustit debugger s F5, a máte novou PowerShell okno s vaší Cmdlet naloženo, a můžete ladit ji však budete chtít.

Použijte ‚SDP‘ alias z libovolného okna PowerShell

Protože funkce Start-DebugPowerShell je v našem profilu a my jsme mu dali přezdívku sdp, můžete použít ke spuštění druhé instance PowerShell kdykoliv ji budete potřebovat.

Odpovězeno 11/03/2016 v 01:29
zdroj uživatelem

hlasů
3

Měl jsem stejné problémy a skončil balení DLL jsem chtěl nahrát uvnitř příkazové exe, který jsem pak volal ze skriptu. Tímto způsobem jsem se vyhýbal načítání DLL v mé žádosti vůbec.

Odpovězeno 25/01/2011 v 09:09
zdroj uživatelem

hlasů
0

Měl jsem nějaký externí modul ( ImportExcel ) jsem chtěl aktualizovat takhle, a to nefungovalo . Za této situace Install-Module -Scope CurrentUser <MyExternalModuleName>(v případě, že je ve složce uživatelé modulu, jinak vynechat -Scope ...param) pracoval.

(Jak se jim to podařilo interně - Nevím, ale budete mít aktuální PS relace).

Odpovězeno 03/09/2018 v 13:36
zdroj uživatelem

hlasů
0

I použít jednoduchý skript, který přejmenuje cílový DLL a zatížení jej jako modul. Zde máme 2 hacky:

  1. když modul se načítá z montážní .net objektu jsme se načíst modul s názvem „dynamic_code_module_FirstPowershellModule“
  2. takže před dovozem jsme vyložit tento modul a vytvořit nový z přejmenovaného souboru

předchozí sestavy zůstat nevyužita v doméně

Skript musí být spuštěn po každém projektu přestavět

Get-Module -Name "*FirstPowershellModule*" | Remove-Module
$ii++
$destPath = "D:\Dev\FirstPowershellModule\FirstPowershellModule\bin\Debug\FirstPowershellModule" + $ii+ ".dll"
Copy-Item D:\Dev\FirstPowershellModule\FirstPowershellModule\bin\Debug\FirstPowershellModule.dll -Destination $destPath
$ass = [System.Reflection.Assembly]::LoadFile($destPath)
import-module -Assembly $ass
Odpovězeno 17/05/2016 v 16:44
zdroj uživatelem

hlasů
0

Moduly PS jsou .net sestavy, když Import-Modulejste před vložením do AppDomain hostitelské PowerShell (aplikace). Remove-ModuleJen odstraňuje moduly z aktuální relaci.

Podle MSDN, http://msdn.microsoft.com/en-us/library/ms173101(v=vs.80).aspx

Neexistuje žádný způsob, jak uvolnit jednotlivé sestavy bez vykládky všechny domény aplikace, které je obsahují. Pomocí metody uvolnit z AppDomain vyložit domény aplikace. Pro více informací viz Vykládání aplikační doméně.

Dalo by se začít nový PowerShell hostitele do nové AppDomain, importovat modul k hostiteli a dělat PowerShell práci. Modul je jako normální, protože byl spuštěn v předchozí hostitele. Jediným rozdílem je, že je v hostiteli spuštěn v jiném AppDomain.

Odpovězeno 07/05/2013 v 02:57
zdroj uživatelem

hlasů
0

Vytvořte kopii DLL a načíst tuto kopii. Můžete Obnovit dll.

Odpovězeno 29/01/2013 v 07:11
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more