2013-10-28 2 views
0

WIX를 사용하여 Windows Installer 프로젝트를 디자인하고 있습니다. 예약 된 다음 사용자 지정 동작에 ActionResult.Success을 반환하는 경로가 하나 있으므로 위탁 된 사용자 지정 작업이 실행되지 않으므로 설치가 실패합니다. 자세한 내용을 설명 드리겠습니다.Windows Installer 사용자 지정 작업 : 커밋 작업이 실행되지 않습니다.

기본적으로 설치와 관련하여 두 가지 커스텀 작업이 있습니다. 하나는 CommitCA이고 다른 하나는 InstallCA입니다. 실행 스케쥴은 다음과 같습니다.

컴파일 된 설치 프로그램에서 CommCA가 InstallCA보다 먼저 스케줄 된 것을 ORCA로부터 확인했습니다. CommitCA의 유형은 3585이고 InstallCA는 3703입니다 (나는 이들에 대한 참조를 찾을 수 없지만 하나는 커밋 조치로 가정하고 다른 하나는 선언 한 것처럼 행동을 취한 것입니다). 아이디어는 CommitCA에서 InstallCA에서 사용할 일부 파일을 생성합니다.

InstallCA의 구조는 다음과 같습니다

Try 
    ' Do some work 
    ... 

Catch ex As Exception 
    ' Log the failure into installation log 
    Return ActionResult.Failure 
End Try 
Return ActionResult.Success 

다음은 혼란을 일부 제공 : 원래 나는 내가 Catch 블록에 ActionResult.Failure 반환의 라인을 가지고 있지 않은 작업 버전을 보유하고 있습니다. 다시 말해 함수는 여전히 실패를 기록하지만 예외가 발생하더라도 결국 Success을 반환합니다. 때로는 예외가 발생하고 로그를 확인하기 때문에 사용자 지정 작업이 성공했다고 말하기 때문에 오해의 소지가 있습니다. 내가 선

그러나
 Return ActionResult.Failure 

을 추가 한 이유입니다, 지금은 더 이상 작동하지 않습니다! 설치 할 때마다 내 CommitCA이 절대 실행되지 않습니다. 참고 : 내가 만든 유일한 코드 수정 InstallCA 아니지만 실제로 InstallCA 전에 예약 된 CommitCA,. 그리고 "결코 실행되지 않는다"는 말은 함수 호출에 넣은 로그 항목을 찾을 수 없다는 것을 의미하며, MMSIBREAK 환경 변수는 전혀 작동하지 않습니다 (rundll32 프로세스에 연결하라는 창이 나타납니다). 결코 튀어 나오지 않는다). 그러나 다음 InstallCA은 여전히 ​​실행됩니다.

Return ActionResult.Failure 줄을 주석 처리하면 모든 항목이 다시 작동합니다. CommitCA에 연결하면 InstallCA이 호출됩니다.

아마도 사용자 지정 작업의 반환 결과에 대해 오해 한 부분이있을 수 있습니다. 이 상황에서 ActionResult.Failure을 반환하지 않겠습니까? 그러나 실제로 나는 어떤 다른 장소에서도 ActionResult.Failure을 돌려줍니다. 실제로 CommitCA 함수 자체에서 동일한 구조를 사용했습니다 : Catch 블록에 ActionResult.Failure을 반환했습니다. 아무도 내가 잘못한 것을 말해 줄 수 있니? 나는 독서로 시작하는 것

답변

3

:

Installation Phases and In-Script Execution Options for Custom Actions in Windows Installer

몇 가지에 대한 이해 CA의를 저지하기 :

는 사용자 지정 작업을 커밋 일반적으로 기계의 상태를 변경하는 것을 의미하지 않는다. 이것들은 롤백 임시 데이터를 정리하기위한 것입니다.

커밋 사용자 지정 작업은 정리할 롤백 데이터가 없음을 의미하므로 롤백이 비활성화 된 경우 (속성 또는 시스템 정책에 따라) 실행되지 않습니다.

때때로 롤백을 수행 할 수없고 가능한 한 늦게 변경을 연기하려는 경우 사용자 정의 작업을 사용하여 시스템을 구성합니다. (사용자 암호 변경, GAC에 DLL 설치) 이러한 시나리오에서 비용 계산은 지연된 사용자 지정 작업에 롤백/커밋이 실행되지 않으므로 작업을 수행하도록 지시해야합니다.

지연된 사용자 지정 동작을 예약하기 전에 롤백 사용자 지정 동작을 예약하고 지연된 사용자 지정 동작 후에 커밋 동작을 예약해야합니다. 이것은 스크립트 생성 단계가 스크립트를 올바르게 생성 할 수 있도록하기위한 것입니다.

지연 단계가 실패하면 스크립트가 뒤로 이동하여 롤백이 실행됩니다.

모든 지연 단계가 성공하면 커밋 스크립트는 앞으로 이동됩니다. 즉, 모든 지연된 CA는 커밋이 실행되기 전에 완료되어야합니다.

+0

답장을 보내 주셔서 감사합니다. 따라서 지연 CA 이전에 커밋 CA를 예약해서는 안됩니까? (그리고 물론 CommitCA가 현재 진행중인 작업을해서는 안됩니다.) 나는 "Commit"이 설치 CA 다음에 있어야하는 것처럼 들리므로 의미가 있다고 생각합니다. 그리고 나는 현재의 모든 작업을 InstallCA – tete

+0

으로 옮겨야한다고 생각합니다. 맞습니다. –

+0

나를 다시 말해 보겠습니다. 해당 지연된 CA보다 먼저 예약하지 마십시오. 다른 CA는 다른 모든 지연된 CA 이후 다른 단계에서 모든 커밋이 실행되므로 문제가 없습니다. –

관련 문제