철회 불가능한 솔루션을 철회하는 방법
-
10-12-2019 - |
문제
샘플 공유점 프로젝트로 일부 테스트를 수행할 때 꽤 큰 실수를 저지른 것 같습니다.아이러니하게도 저는 많은 테스트를 먼저 작성하지 않고 단위 테스트 가능한 솔루션을 늘리려고 했습니다.저는 아직 SharePoint를 처음 접했고 SP 및 IoC로 무엇을 할 수 있는지, 무엇을 할 수 없는지 알아보고 싶었습니다.
그래서 너무 자세히 설명하지 않고 실수로 재귀적인 일부 코드를 작성하여 결국 StackOverflowException이 발생하게 되었습니다.별거 아니죠?솔루션을 철회하고 제거하십시오.문제는 솔루션 기능이 실행되는 동안 이 코드가 호출된다는 것입니다. FeatureUninstalling
방법 SPFeatureReceiver
.
(글쎄, 꼭 그렇지는 않습니다.코드는 도중에 호출됩니다. SPFeatureReceiver
의 정적 생성자입니다.이유가 궁금하시다면 FeatureInstalling 및 FeatureUninstalling 메서드 중에 사용할 수 있는 종속성을 주입하기 위해 Castle Windsor를 사용하여 루트를 구성하려고 했습니다.)
따라서 중앙 웹 관리자 또는 Uninstall-SPSolution을 사용하려고 하면 다음과 같은 일이 발생합니다.
- 솔루션을 철회하는 작업이 예약되어 있습니다.
- 작업이 실행되고 솔루션 철회를 시도합니다.
- 작업은 FeatureUninstalling을 호출하기 위해 새로운 SPFeatureReceiver를 생성합니다.
- SPFeatureReceiver(정적) 생성자는 루트를 구성하려고 시도하는 코드를 호출하고 그 안에서 결국 StackOverflowException이 발생합니다.
- OWSTIMER.exe에서 예외가 발생했다는 팝업 메시지를 받고 디버깅할지 묻습니다.
- OWSTIMER.exe가 다시 시작되고 2단계로 돌아갑니다.
따라서 질문은 다음과 같습니다.취소할 수 없는 솔루션을 취소하는 방법은 무엇입니까?
해결책
문제가 되는 코드를 주석 처리하고 다시 빌드/재패키징한 다음 실행해 보셨나요? Update-SPSolution
명령?
그만큼 FeatureUninstalling
제거 시 이벤트가 발생하며 업그레이드할 때 호출되지 않을 것이라고 생각합니다. FeatureUpgrading
이벤트)입니다.
성공적으로 업그레이드하고 문제가 있는 코드를 교체할 수 있으면 솔루션을 안전하게 제거할 수 있습니다.
다시 생각해 보면 위의 제안은 작동하지 않을 것입니다. 왜냐하면 이 예외가 이벤트가 아닌 생성자에서 발생하는 경우 분명히 솔루션 수정 방법(업그레이드 및 업그레이드 비교)에 관계없이 여전히 호출될 것이기 때문입니다.제거).문제가 되는 코드를 제거한 후 철회를 시도한 후 GAC에서 .dll을 수동으로 바꿀 수 있습니다.
다른 팁
나도 비슷한 생각을 갖고 있었어 @RJ Cuthbertson의 답변 GAC에 관해서는 거기에서 아무것도 제거할 수 없습니다. 이걸 발견하기 전까지:
중요한!프로덕션 시스템에서는 절대로 이 작업을 수행하지 말고 나중에 항상 다시 켜십시오.
로컬 보안 정책 MMC 열기
보안 설정으로 이동 -> 로컬 정책 -> 보안 옵션
"사용자 계정 컨트롤:관리자 승인에서 모든 관리자를 실행하고 설정을 활성화에서 비활성화로 변경합니다.
재부팅하면 이제 어셈블리를 삭제할 수 있습니다.
위의 단계에 따라 로컬 보안 정책 설정을 다시 활성화하고 다시 재부팅하여 다시 적용하세요.
위의 4단계 후에 GAC에서 Castle.Windsor.dll을 제거할 수 있었고 그 후에는 철회/제거/제거가 모두 작동했습니다.