Как отозвать неубираемое решение
-
10-12-2019 - |
Вопрос
Похоже, я допустил довольно большую ошибку при тестировании примера проекта Sharepoint.По иронии судьбы, я пытался создать решение, пригодное для модульного тестирования, без предварительного написания многих тестов.Я все еще новичок в SharePoint и хотел узнать, что я могу и чего не могу делать с SP и IoC.
Итак, не вдаваясь в подробности, я случайно написал рекурсивный код, который в конечном итоге выдает исключение StackOverflowException.Ничего страшного, правда?Просто отберите решение и удалите его.Проблема в том, что этот код вызывается во время реализации функции решения. FeatureUninstalling
метод в SPFeatureReceiver
.
(Ну, не совсем так.В конечном итоге код вызывается во время SPFeatureReceiver
статический конструктор.Если вам интересно, почему, я пытался составить корень с помощью Castle Windsor, чтобы внедрить зависимости, которые можно использовать во время методов FeatureInstalling и FeatureUninstalling.)
Итак, что происходит при попытке использовать центральный веб-администратор или Uninstall-SPSolution:
- Запланировано задание по отзыву решения.
- Задание выполняется и пытается отозвать решение.
- Задание создает новый SPFeatureReceiver для вызова FeatureUninstalling.
- Конструктор SPFeatureReceiver (статический) вызывает код, который пытается составить корень, и внутри него вызывает исключение StackOverflowException.
- Я получаю всплывающее сообщение о том, что OWSTIMER.exe обнаружил исключение, и спрашивает, хочу ли я выполнить отладку.
- OWSTIMER.exe перезапустится и вернется к шагу №2.
Отсюда вопрос:Как отозвать неубираемое решение?
Решение
Пробовали ли вы закомментировать код-нарушитель, перестроить/переупаковать, а затем запустить Update-SPSolution
команда?
А FeatureUninstalling
событие происходит при удалении, и, я полагаю, оно не будет вызываться при обновлении (вот что такое FeatureUpgrading
мероприятие для).
Если вы сможете успешно выполнить обновление и заменить проблемный код, вы сможете безопасно удалить решение.
Если подумать, мое предложение выше не сработает, потому что, если это исключение происходит в конструкторе, а не в событии, очевидно, что оно все равно будет вызываться независимо от метода модификации решения (Upgrade vs.Удалить).Однако вы можете вручную заменить .dll в GAC после удаления нарушающего кода, а затем попытаться отозвать его.
Другие советы
у меня была похожая идея Ответ @RJ Катбертсона что касается GAC, но он не позволил мне ничего удалить оттуда. Пока я не нашел это:
ВАЖНЫЙ!Никогда не делайте этого в производственной системе и всегда после этого включайте ее снова.
Открыть локальную политику безопасности MMC
Перейдите в «Настройки безопасности» -> «Локальные политики» -> «Параметры безопасности».
Найдите «Контроль учетных записей пользователей:Запустите всех администраторов в режиме «Одобрение администратора» и измените настройку с «Включено» на «Отключено».
Перезагружаемся и теперь сборки можно удалять.
Выполните действия, описанные выше, чтобы повторно включить параметр локальной политики безопасности, и снова перезагрузите компьютер, чтобы применить его повторно.
После шага № 4, описанного выше, мне удалось удалить Castle.Windsor.dll из GAC, и после этого все операции удаления/удаления/удаления сработали.