Вопрос

Похоже, я допустил довольно большую ошибку при тестировании примера проекта Sharepoint.По иронии судьбы, я пытался создать решение, пригодное для модульного тестирования, без предварительного написания многих тестов.Я все еще новичок в SharePoint и хотел узнать, что я могу и чего не могу делать с SP и IoC.

Итак, не вдаваясь в подробности, я случайно написал рекурсивный код, который в конечном итоге выдает исключение StackOverflowException.Ничего страшного, правда?Просто отберите решение и удалите его.Проблема в том, что этот код вызывается во время реализации функции решения. FeatureUninstalling метод в SPFeatureReceiver.

(Ну, не совсем так.В конечном итоге код вызывается во время SPFeatureReceiverстатический конструктор.Если вам интересно, почему, я пытался составить корень с помощью Castle Windsor, чтобы внедрить зависимости, которые можно использовать во время методов FeatureInstalling и FeatureUninstalling.)

Итак, что происходит при попытке использовать центральный веб-администратор или Uninstall-SPSolution:

  1. Запланировано задание по отзыву решения.
  2. Задание выполняется и пытается отозвать решение.
  3. Задание создает новый SPFeatureReceiver для вызова FeatureUninstalling.
  4. Конструктор SPFeatureReceiver (статический) вызывает код, который пытается составить корень, и внутри него вызывает исключение StackOverflowException.
  5. Я получаю всплывающее сообщение о том, что OWSTIMER.exe обнаружил исключение, и спрашивает, хочу ли я выполнить отладку.
  6. OWSTIMER.exe перезапустится и вернется к шагу №2.

Отсюда вопрос:Как отозвать неубираемое решение?

Это было полезно?

Решение

Пробовали ли вы закомментировать код-нарушитель, перестроить/переупаковать, а затем запустить Update-SPSolution команда?

А FeatureUninstalling событие происходит при удалении, и, я полагаю, оно не будет вызываться при обновлении (вот что такое FeatureUpgrading мероприятие для).

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

Если подумать, мое предложение выше не сработает, потому что, если это исключение происходит в конструкторе, а не в событии, очевидно, что оно все равно будет вызываться независимо от метода модификации решения (Upgrade vs.Удалить).Однако вы можете вручную заменить .dll в GAC после удаления нарушающего кода, а затем попытаться отозвать его.

Другие советы

у меня была похожая идея Ответ @RJ Катбертсона что касается GAC, но он не позволил мне ничего удалить оттуда. Пока я не нашел это:

ВАЖНЫЙ!Никогда не делайте этого в производственной системе и всегда после этого включайте ее снова.

  1. Открыть локальную политику безопасности MMC

  2. Перейдите в «Настройки безопасности» -> «Локальные политики» -> «Параметры безопасности».

  3. Найдите «Контроль учетных записей пользователей:Запустите всех администраторов в режиме «Одобрение администратора» и измените настройку с «Включено» на «Отключено».

  4. Перезагружаемся и теперь сборки можно удалять.

  5. Выполните действия, описанные выше, чтобы повторно включить параметр локальной политики безопасности, и снова перезагрузите компьютер, чтобы применить его повторно.

После шага № 4, описанного выше, мне удалось удалить Castle.Windsor.dll из GAC, и после этого все операции удаления/удаления/удаления сработали.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top