public bool Initialize(Session session, string resourcePath, ref InstallUIOptions uiLevel) { Debugger.Launch(); if (session != null && (session.IsUninstalling() || uiLevel.IsBasic())) return false; //use built-in MSI basic UI ReadDialogs(session); var startEvent = new ManualResetEvent(false); var uiThread = new Thread(() => { shell = new UIShell(); //important to create the instance in the same thread that call ShowModal shell.ShowModal(new MsiRuntime(session) { StartExecute = () => startEvent.Set() }, this); uiExitEvent.Set(); }); uiThread.SetApartmentState(ApartmentState.STA); uiThread.Start(); int waitResult = WaitHandle.WaitAny(new[] { startEvent, uiExitEvent }); if (waitResult == 1) { //UI exited without starting the install. Cancel the installation. throw new InstallCanceledException(); } else { // Start the installation with a silenced internal UI. // This "embedded external UI" will handle message types except for source resolution. uiLevel = InstallUIOptions.NoChange | InstallUIOptions.SourceResolutionOnly; shell.OnExecuteStarted(); return true; } }