2016-03-30 3 views
1

Je fournis des packages de 3 msi dans mon MBA (Managed Bootstrapper). L'utilisateur a le choix de choisir les paquets qu'il veut installer. Tout va bien. Lorsque l'utilisateur tente de modifier l'installation à partir du Panneau de configuration, sélectionne nouveau paquet de la source de dialogue et d'origine (MBA.exe) est manquant, l'installation a échoué avec connexion suivant:Bootstrapper géré: Échec lors de l'invite de la source

[553C:0A88][2016-03-30T16:00:54]w341: Prompt for source of container: WixAttachedContainer, path: D:\work\MBA.Install.Bundle\bin\Debug\MBA.exe<br/> 
[553C:0A88][2016-03-30T16:00:54]e054: Failed to resolve source for file: D:\work\MBA.Install.Bundle\bin\Debug\MBA.exe, error: 0x80070002. 
[553C:0A88][2016-03-30T16:00:54]e000: Error 0x80070002: Failed while prompting for source (original path 'D:\work\MBA.Install.Bundle\bin\Debug\MBA.exe'). 
[553C:0A88][2016-03-30T16:00:54]e311: Failed to acquire container: WixAttachedContainer to working path: C:\Users\Me\AppData\Local\Temp\{1338381A-F85F-4B6D-83EA-A0A2D1A369C1}\10A35D6D6CAC04B3DC248033B1588CBD67AD698B, error: 0x80070002. 
[553C:0A88][2016-03-30T16:00:54]i000: CachePackageComplete: Pkg_Id=EMS.Server Resulted=None 
[553C:0A88][2016-03-30T16:00:54]i000: CacheComplete: Status=-2147024894 
[553C:3C24][2016-03-30T16:00:54]e000: Error 0x80070002: Failed while caching, aborting execution. 

J'ai essayé de capturer cela dans ResolveSource gestionnaire d'événements. e.LocalSource et e.DownloadSource sont des propriétés en lecture seule. Il n'y a pas de critères pour télécharger le fichier manquant, tous doivent être présents localement.

Je lis sur le Propmpt pour obtenir la source d'installation d'origine ici: https://blogs.msdn.microsoft.com/heaths/2007/10/25/resolvesource-requires-source/

mais cela est sur le point d'installation msi, alors que dans mon MBA, cette boîte de dialogue est supprimée.

Questions:

  1. Comment définir le LocalSource manuellement (peut-être en prenant d'entrée par boîte de dialogue de l'utilisateur)?
  2. Puis-je définir WixAttachedContainer à un autre chemin de travail au moment de l'exécution mais en saisissant les données de l'utilisateur?
  3. Pouvons-nous définir Engine.SetLocalSource() lors de l'exécution?

Merci un bouquet ...

Répondre

0

Après avoir lu les messages et une bonne réponse de la liste email Wix-utilisateurs, j'ai eu l'idée qui a partiellement réussi:

  1. Dans ResolveSource gestionnaire d'événements , J'ai appelé Engine.SetLocalSource(),
  2. puis appelé Engine.Detect().

Ceci réinitialiser toutes les recherches, etc, etc et il réinitier Ajout/Suppression/session de désinstallation/de réparation avec chemin mises à jour e.LocalSource. Et cela fonctionne bien maintenant. Le repos est, je dois lutter un peu pour cacher le redémarrage de la session et continuer l'écran d'où l'utilisateur a choisi le nouveau composant (ou si désélectionné tout), c'est-à-dire PlantAction(LaunchAction.Install).

que je presque pensé-où cela serait injecté, vient de se noyer dans le code à nouveau (son MVVM fait :()

0

Ce peut être bug dans le jeu d'outils WiX - voir https://github.com/wixtoolset/issues/issues/5586

  1. Remplacer ou activer l'événement ResolveSource.
  2. Changement LocalSource du conteneur en utilisant SetLocalSource()
  3. Set Result de l'événement pour Result.Retry

Voir l'exemple suivant:

private void OnResolveSource(object sender, ResolveSourceEventArgs e) 
{ 
    var wixBundleOriginalSource = Application.Engine.StringVariables["WixBundleOriginalSource"]; 

    Application.Engine.Log(LogLevel.Verbose, $"Setting local source for {e.PackageOrContainerId} to '{wixBundleOriginalSource}' (WixBundleOriginalSource)"); 
    Application.Engine.SetLocalSource(e.PackageOrContainerId, e.PayloadId, wixBundleOriginalSource); 

    Application.Engine.Log(LogLevel.Verbose, $"Retry to resolve source for {e.PackageOrContainerId}"); 
    e.Result = Result.Retry; 
}