문제

샘플 공유점 프로젝트로 일부 테스트를 수행할 때 꽤 큰 실수를 저지른 것 같습니다.아이러니하게도 저는 많은 테스트를 먼저 작성하지 않고 단위 테스트 가능한 솔루션을 늘리려고 했습니다.저는 아직 SharePoint를 처음 접했고 SP 및 IoC로 무엇을 할 수 있는지, 무엇을 할 수 없는지 알아보고 싶었습니다.

그래서 너무 자세히 설명하지 않고 실수로 재귀적인 일부 코드를 작성하여 결국 StackOverflowException이 발생하게 되었습니다.별거 아니죠?솔루션을 철회하고 제거하십시오.문제는 솔루션 기능이 실행되는 동안 이 코드가 호출된다는 것입니다. FeatureUninstalling 방법 SPFeatureReceiver.

(글쎄, 꼭 그렇지는 않습니다.코드는 도중에 호출됩니다. SPFeatureReceiver의 정적 생성자입니다.이유가 궁금하시다면 FeatureInstalling 및 FeatureUninstalling 메서드 중에 사용할 수 있는 종속성을 주입하기 위해 Castle Windsor를 사용하여 루트를 구성하려고 했습니다.)

따라서 중앙 웹 관리자 또는 Uninstall-SPSolution을 사용하려고 하면 다음과 같은 일이 발생합니다.

  1. 솔루션을 철회하는 작업이 예약되어 있습니다.
  2. 작업이 실행되고 솔루션 철회를 시도합니다.
  3. 작업은 FeatureUninstalling을 호출하기 위해 새로운 SPFeatureReceiver를 생성합니다.
  4. SPFeatureReceiver(정적) 생성자는 루트를 구성하려고 시도하는 코드를 호출하고 그 안에서 결국 StackOverflowException이 발생합니다.
  5. OWSTIMER.exe에서 예외가 발생했다는 팝업 메시지를 받고 디버깅할지 묻습니다.
  6. OWSTIMER.exe가 다시 시작되고 2단계로 돌아갑니다.

따라서 질문은 다음과 같습니다.취소할 수 없는 솔루션을 취소하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

문제가 되는 코드를 주석 처리하고 다시 빌드/재패키징한 다음 실행해 보셨나요? Update-SPSolution 명령?

그만큼 FeatureUninstalling 제거 시 이벤트가 발생하며 업그레이드할 때 호출되지 않을 것이라고 생각합니다. FeatureUpgrading 이벤트)입니다.

성공적으로 업그레이드하고 문제가 있는 코드를 교체할 수 있으면 솔루션을 안전하게 제거할 수 있습니다.

다시 생각해 보면 위의 제안은 작동하지 않을 것입니다. 왜냐하면 이 예외가 이벤트가 아닌 생성자에서 발생하는 경우 분명히 솔루션 수정 방법(업그레이드 및 업그레이드 비교)에 관계없이 여전히 호출될 것이기 때문입니다.제거).문제가 되는 코드를 제거한 후 철회를 시도한 후 GAC에서 .dll을 수동으로 바꿀 수 있습니다.

다른 팁

나도 비슷한 생각을 갖고 있었어 @RJ Cuthbertson의 답변 GAC에 관해서는 거기에서 아무것도 제거할 수 없습니다. 이걸 발견하기 전까지:

중요한!프로덕션 시스템에서는 절대로 이 작업을 수행하지 말고 나중에 항상 다시 켜십시오.

  1. 로컬 보안 정책 MMC 열기

  2. 보안 설정으로 이동 -> 로컬 정책 -> 보안 옵션

  3. "사용자 계정 컨트롤:관리자 승인에서 모든 관리자를 실행하고 설정을 활성화에서 비활성화로 변경합니다.

  4. 재부팅하면 이제 어셈블리를 삭제할 수 있습니다.

  5. 위의 단계에 따라 로컬 보안 정책 설정을 다시 활성화하고 다시 재부팅하여 다시 적용하세요.

위의 4단계 후에 GAC에서 Castle.Windsor.dll을 제거할 수 있었고 그 후에는 철회/제거/제거가 모두 작동했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top