Можно ли удалить Добавленный Тип в PowerShell снова?

Я в настоящее время пишу библиотеку в C# и использовал PowerShell для быстрого тестирования его в некоторых случаях. Однако это препятствует тому, чтобы я восстановил проект, поскольку PowerShell очевидно все еще имеет открытый DLL.

Есть ли способ разгрузить DLL снова после добавления его с Add-Type? Документация, кажется, не имеет подсказки об этом, и очевидный кандидат был бы Remove-Type (который не существует – существует только одна команда так или иначе с Type как его существительное). Это становится громоздким, чтобы закрыть PowerShell и сделать весь материал навигации к каталогу сборки и добавления типа снова каждый раз, когда я хочу восстановить.

58
задан Joey 30 July 2010 в 08:06
поделиться

4 ответа

Как говорят другие, это поведение .NET. Сборки, загруженные в AppDomain, не могут быть выгружены. Только AppDomain может быть выгружен, а powershell использует один appdomain. Несколько лет назад я немного писал об этом в блоге:

https://web.archive.org/web/20170707034334/http://www.nivot.org/blog/post/2007/12/07/WhyAppDomainsAreNotAMagicBullet

Когда я провожу такие тесты, я обычно держу оболочку открытой и использую вложенную оболочку для проведения тестов. Запустите powershell, cd в папку bin, затем запустите "powershell" для запуска вложенной оболочки (нового процесса), "exit" для начала работы, и снова запустите "powershell".

54
ответ дан 24 November 2019 в 18:52
поделиться

Я считаю, что самый простой способ обойти эту проблему - заключить Add-Type и тестовый код в Start-Job . Start-Job создаст фоновый процесс, и тип будет загружен туда. Как только вы закончите, процесс прекратится, и вы сможете повторить попытку.

Вот пример того, как это выглядит:

$job = Start-Job -ScriptBlock {

    Add-Type -path 'my.dll'
    $myObj = new-object My.MyTestClassName

    $result = $myObj.TestMethod
    $result
}
Wait-Job $job
Receive-Job $job

Вывод тестового метода будет отображаться на консоли.

37
ответ дан 24 November 2019 в 18:52
поделиться

Если ваша сборка не требует контекста привязки , вы можете сделать это:

$bytes = [System.IO.File]::ReadAllBytes("Path_To_Your_Dll.dll")
[System.Reflection.Assembly]::Load($bytes)
23
ответ дан 24 November 2019 в 18:52
поделиться

Я столкнулся с подобной проблемой. Невозможно выгрузить тип / сборку (потому что это применимо к .NET framework).

В .NET вы можете решить эту проблему, если создадите новый домен приложения ( System.AppDomain ) и загрузите сборку в этот домен. Можно выгрузить домен приложения, что также выгружает все библиотеки DLL.

Я еще не пробовал, потому что мне гораздо проще закрыть вкладку в Консоли и открыть новую.

0
ответ дан 24 November 2019 в 18:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: