Powershell ISE: закрытие вкладки PowerShell не разблокирует динамически загружаемую сборку .NET

376
Sau

Пожалуйста, рассмотрите следующий сценарий.

  • Запустите Windows Powershell ISE (64-разрядная версия )
  • Создать новую вкладку PowerShell
  • Создайте новый сценарий PS, который загружает пользовательскую сборку, вызывая [System.Reflection.Assembly] :: LoadFrom

  • Создать экземпляр объекта из пользовательской сборки путем вызова New-Object команды

  • Запустите скрипт и убедитесь, что экземпляр вашего пользовательского объекта был создан.
  • Закройте вкладку PowerShell . Но продолжайте работу PowerShell ISE. Я ожидал, что PowerShell ISE полностью разгрузит сборку.

Однако пользовательская сборка блокируется до тех пор, пока PowerShell ISE не будет полностью закрыт.

Я занимаюсь разработкой пользовательской библиотеки .NET с использованием Visual Studio .NET, и PowerShell является клиентским приложением этой библиотеки. Поскольку закрытие вкладки не разблокирует сборку, мне приходится закрывать и перезапускать Powershell ISE каждый раз, когда я вносю изменения в Visual Studio. Такое поведение PowerShell ISE резко замедляет мое время разработки.

Есть ли решение этой проблемы?

Загрузка пользовательской сборки в ISE через рефлексию

Спасибо сау

0
Если вы загружаете форму, вы должны убедиться, что вы ее разгрузили. Ramhound 6 лет назад 0
Привет @ Ramhound, Просто добавил картинку, чтобы лучше объяснить мой сценарий. Я не уверен, что понимаю под "разгрузкой". Я не создаю форму Windows. Просто класс C #. Я думаю, что проблема появилась бы, даже если бы это была пользовательская форма Windows, потому что PowerShell загрузил сборку в свой домен приложений. Я ожидал, что PowerShell выгрузит домен приложения, связанный с вкладкой PowerShell. Sau 6 лет назад 0
Сборки .NET не могут быть выгружены. Единственный способ выгрузить сборку - это разрушить весь AppDomain. Daniel B 6 лет назад 0
Привет @DanielB, спасибо за комментарий. Вы абсолютно правы. Знаете ли вы, почему PowerShell не разрушает домен приложения при закрытии вкладки? Я считаю, что это ошибка. Но я был бы удивлен, что Microsoft не знает об этой проблеме. Sau 6 лет назад 0
PowerShell не использует домены приложений. Вы можете легко проверить это с помощью Process Explorer на вкладке .NET Сборки процесса. Daniel B 6 лет назад 0
Привет @DanielB, спасибо за комментарий. Из консоли ** ISE ** я опробовал `[System.AppDomain] :: CurrentDomain`, а затем` [System.Reflection.Assembly] :: LoadFrom`, а затем `[System.AppDomain] :: CurrentDomain.GetAssemblies ( ) `которая показывает мою кастомную сборку. Я не собираюсь зацикливаться на том, будет ли ** PowerShell ISE ** разделяться на домены приложений. По моему мнению, ** ISE ** должен иметь функцию переустановки среды. Что-то подобное было в более старом продукте, выпущенном не Microsoft. ** PowerGUI ** (в настоящее время больше не выпускается). Sau 6 лет назад 0
Привет @DanielB, сделал некоторые дальнейшие эксперименты. Создайте несколько вкладок ** PowerShell ISE ** и выполните команду `[System.AppDomain] :: CurrentDomain` в каждой из них. Я обнаружил, что в каждой из вкладок идентификатор AppDomain был идентичным. Это приводит меня к выводу, что ** PowerShell ISE ** действительно не разделяет себя на ** домены приложений **. Sau 6 лет назад 0
К сожалению, домены приложений получить очень сложно. Я нахожу понятным, что Microsoft решила не использовать их в PowerShell ISE. Daniel B 6 лет назад 0
Правда, «Новая вкладка PowerShell» создает новый PowerShell «Runspace», а не «AppDomain». George Chakhidze 6 лет назад 0

0 ответов на вопрос

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