Я в настоящее время пишу библиотеку в C# и использовал PowerShell для быстрого тестирования его в некоторых случаях. Однако это препятствует тому, чтобы я восстановил проект, поскольку PowerShell очевидно все еще имеет открытый DLL.
Есть ли способ разгрузить DLL снова после добавления его с Add-Type
? Документация, кажется, не имеет подсказки об этом, и очевидный кандидат был бы Remove-Type
(который не существует – существует только одна команда так или иначе с Type
как его существительное). Это становится громоздким, чтобы закрыть PowerShell и сделать весь материал навигации к каталогу сборки и добавления типа снова каждый раз, когда я хочу восстановить.
Как говорят другие, это поведение .NET. Сборки, загруженные в AppDomain, не могут быть выгружены. Только AppDomain может быть выгружен, а powershell использует один appdomain. Несколько лет назад я немного писал об этом в блоге:
Когда я провожу такие тесты, я обычно держу оболочку открытой и использую вложенную оболочку для проведения тестов. Запустите powershell, cd в папку bin, затем запустите "powershell" для запуска вложенной оболочки (нового процесса), "exit" для начала работы, и снова запустите "powershell".
Я считаю, что самый простой способ обойти эту проблему - заключить 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
Вывод тестового метода будет отображаться на консоли.
Если ваша сборка не требует контекста привязки , вы можете сделать это:
$bytes = [System.IO.File]::ReadAllBytes("Path_To_Your_Dll.dll")
[System.Reflection.Assembly]::Load($bytes)
Я столкнулся с подобной проблемой. Невозможно выгрузить тип / сборку (потому что это применимо к .NET framework).
В .NET вы можете решить эту проблему, если создадите новый домен приложения ( System.AppDomain
) и загрузите сборку в этот домен. Можно выгрузить домен приложения, что также выгружает все библиотеки DLL.
Я еще не пробовал, потому что мне гораздо проще закрыть вкладку в Консоли и открыть новую.