2016-09-21 11 views
1

사용자가 설치하려는 내용에 따라 여러 개의 MSI를 설치하기 위해 사용자 정의 Bootstrapper을 만듭니다. 지금까지 모든 것이 잘 작동하지만 설치 프로그램을 다시 실행하고 제거 할 MSI를 선택할 수 있기를 바랍니다. 설치된 MSI가 모두 제거되면 번들을 제거한 다음 다른 MSI를 추가하거나 제거 할 수 있도록 그대로 두십시오.번들의 일부를 프로그램 창에서 삭제하지 않고 제거하는 방법은 무엇입니까?

는 내가 PlanPackageBegin 이벤트 처리기에서이 같은 일을 생각하고 있었는데

:

Bootstrapper.Engine.Apply(System.IntPtr.Zero); 

그러나 번들도 제거 얻는다 다음 PlanComplete 이벤트 처리기에서 다음

if (WisState == State.Uninstalling) 
     { 
      if (e.PackageId.Equals("MSI1", StringComparison.Ordinal)) 
      { 
       if (requestMSI1 == RequestState.Present) 
       { 
        e.State = RequestState.None; 
       } 
       else 
       { 
        e.State = RequestState.Absent; 
       } 
      } 
} 

그리고 나는 시작 .

모든 MSI가 제거되지 않는 경우 어떻게 내 번들의 제거를 방지 할 수 있습니까?

답변

0

나는 내 길을 찾을 수있는 방법을 찾았습니다.

제거 프로그램을 계획하는 대신 내 번들이 제거되지 않도록 복구를 계획했습니다. 그리고 모든 MSI가 제거 될 때 그것을 제거하기 위하여 나는 제거를 계획한다.

if (requestMSI1 == RequestState.Absent && requestMSI2 == RequestState.Absent) 
{ 
    this.WisState = State.FullUninstalling; 
    Bootstrapper.Engine.Plan(LaunchAction.Uninstall); 
} 
else 
{ 
    this.WisState = State.Uninstalling; 
    Bootstrapper.Engine.Plan(LaunchAction.Repair); 
} 

내가 (FullUninstalling되지 않음) 제거를 해요 만약 내가 다음 PlanPackageBegin 체크인 : 나는 FullUninstalling이야 경우

if (WisState == State.Uninstalling) 
{ 
    if (e.PackageId.Equals("MSI1", StringComparison.Ordinal)) 
    { 
     if (requestMSI1 == RequestState.Absent) 
     { 
      e.State = RequestState.Absent; 
     } 
     else 
     { 
      e.State = RequestState.None; 
     } 
    } 
    else if (e.PackageId.Equals("MSI2", StringComparison.Ordinal)) 
    { 
     if ("requestMSI" == RequestState.Absent) 
     { 
      e.State = RequestState.Absent; 
     } 
     else 
     { 
      e.State = RequestState.None; 
     } 
    } 
} 

는 그리고 나는 Bootstrapper은 계획 그 자체를 처리 할 수 ​​있습니다.

WisState 및 requestMSI1/2는 내 UI가 표시해야하는 것과 사용자의 선택에 따라 달라지는 변수입니다.