1

J'ai une situation très étrange où le code d'action personnalisé ne s'exécute pas synchroniquement.
Comme vous dans le journal peut voir le "WinRoot dir" ligne de journal doit apparaître après la ligne "CommonFiles Dir". Cependant, il apparaît à la fin.Windows Installer exécute le code d'action personnalisé dans la mauvaise séquence et échoue

Voici le code:

[CustomAction] 
    public static ActionResult CCCA_LogProductName(Session session) 
    { 
     productName = session[InstallShieldConstants.productName]; 
     CustomActionData customActionData = new CustomActionData(); 

     // log properties 
     CCULog.LogMessageToFile(session, "CCCA_LogProductName", "INSTALLDIR : " + 
           session[InstallShieldConstants.installDir]); 
     CCULog.LogMessageToFile(session, "CCCA_LogProductName", "Product Version : " + 
           session[InstallShieldConstants.productVersion]); 
     CCULog.LogMessageToFile(session, "CCCA_LogProductName", "Source Dir : " + 
           session[InstallShieldConstants.sourceDir]); 
     CCULog.LogMessageToFile(session, "CCCA_LogProductName", "Support Dir : " + 
           session[InstallShieldConstants.supportDir]); 
     CCULog.LogMessageToFile(session, "CCCA_LogProductName", "CommonFiles Dir : " + 
           Environment.GetEnvironmentVariable("CommonProgramFiles")); 
     CCULog.LogMessageToFile(session, "CCCA_LogProductName", "WinRoot Dir : " + 
           session[InstallShieldConstants.windowsVolumeDir]); 

     customActionData.Add(InstallShieldConstants.productName, productName); 
     session["CCCA_LogProductNameOnFirstTimeInstallStart"] = customActionData.ToString(); 
     session["CCCA_LogProductNameOnUninstallStart"] = customActionData.ToString(); 
     session["CCCA_LogProductNameOnUninstallEnd"] = customActionData.ToString(); 
     session["CCCA_LogProductNameOnInstallStart"] = customActionData.ToString(); 
     session["CCCA_LogProductNameOnInstallEnd"] = customActionData.ToString(); 

     return ActionResult.Success; 
    } 

Alors que le journal indique ce qui suit:

Appel action personnalisée CosmoPublisherCustomActions CosmoPublisherCustomActions.CCUCustomActions.CCCA_LogProductName 23/07/2015 11:24: 44 :: CosmoPublisher :: CCCA_LogProductName :: INSTALLDIR: Fichiers C: \ Program (x86) \ CosmoCom \ Server \ 23/07/2015 11:24:44 :: CosmoPublisher :: CCCA_LogProductNam e :: Produit Version: 7.2.0.119 23/07/2015 11:24:44 :: CosmoPublisher :: CCCA_LogProductName :: Source Source: C: \ Program Files (x86) \ CosmoCom \ Composants serveur \ CosmoPublisherHotfixes \ HF72 -40106 \ 23/07/2015 11:24:44 :: CosmoPublisher :: CCCA_LogProductName :: Support Dir: C: \ Utilisateurs \ SVCCOS ~ 1 \ AppData \ Local \ Temp {D3407C75-8846-4DB4-8736- 149A884053EF} 23/07/2015 11:24:44 :: CosmoPublisher :: CCCA_LogProductName :: CommonFiles Dir: C: \ Program Files (x86) \ Fichiers communs MSI (s) (C4! 70) [11:24 : 44: 641]: CHANGEMENT DE PROPRIETE: Ajout Propriété CCCA_LogProductNameOnFirstTimeInstallStart. Sa valeur est 'ProductName = Media Services .NET'. MSI (s) (C4! 70) [11: 24: 44: 642]: CHANGEMENT DE PROPRIETE: ajout de la propriété CCCA_LogProductNameOnUninstallStart. Sa valeur est 'ProductName = Media Services .NET'. MSI (s) (C4! 70) [11: 24: 44: 642]: CHANGEMENT DE PROPRIETE: Ajout de propriété CCCA_LogProductNameOnUninstallEnd. Sa valeur est 'ProductName = Media Services .NET'. MSI (s) (C4! 70) [11: 24: 44: 642]: CHANGEMENT DE PROPRIETE: Ajout de la propriété CCCA_LogProductNameOnInstallStart. Sa valeur est 'ProductName = Media Services .NET'. MSI (s) (C4! 70) [11: 24: 44: 642]: CHANGEMENT DE PROPRIETE: Ajout de propriété CCCA_LogProductNameOnInstallEnd. Sa valeur est 'ProductName = Media Services .NET'. 07/23/2015 11:24:44 :: CosmoPublisher :: CCCA_LogProductName :: WinRoot Dir: C: \ CustomAction CCCA_LogProductName a retourné le code d'erreur réel 1603 (notez que cela ne peut pas être 100% précis si la traduction est passée dans le bac à sable) Action terminé 11:24:44: CCCA_LogProductName. Valeur renvoyée 3. Action terminée 11:24:44: INSTALL. Renvoyez la valeur 3.

Mon action personnalisée Installshield est définie sur 'Synchrone', donc je ne comprends pas pourquoi cela se produit. Il est étrange que l'action personnalisée qui vient de se connecter au fichier échoue.
Merci

EDIT:
Ma fonction journal écrit dans le journal de la session et le fichier local:

/// <summary> 
    /// Writing message to log file 
    /// </summary> 
    /// <param name="tag">tag of the log message.</param> 
    /// <param name="message">message to write to log.</param> 
    public static void LogMessageToFile(Session session, string tag, string message) 
    { 
     StreamWriter sw = File.AppendText(
      GetTempPath() + logFileName); 
     try 
     { 
      string logLine = string.Format(
       "{0:G} :: {1} :: {2}", DateTime.Now, tag, message); 
      sw.WriteLine(logLine); 
      session.Log("{0:G} :: {1}:: {2} :: {3}", DateTime.Now, logTag, tag, message); 
     } 
     finally 
     { 
      sw.Close(); 
     } 
    } 

Répondre

0

Je suis curieux de savoir pourquoi nous ne voyons pas une trace de la pile de DTF. DTF vous permet d'attacher un débogueur, je suis sûr que les commandes fonctionnent dans le bon ordre. Je n'ai jamais vu MSI déconnecter mais c'est possible. Vous pouvez essayer/l * v! (emphase sur!) pour voir si cela fait une différence dans l'ordre dans lequel il est apparu.

La plus simple des autorités de certification peut échouer. C'est pourquoi il est important d'en être le maître ou de ne pas le faire du tout.

+0

Salut, Merci pour la réponse. Que voulez-vous dire par "être un maître d'eux"? En outre, avez-vous la moindre idée de la raison pour laquelle une simple autorité de certification qui se connecte et renvoie ActionResult.success peut échouer? Merci ! – liorafar

+1

Vous ne montrez pas le code source à CCULog.LogMessageToFile donc il n'est pas possible de dire pourquoi il échoue. La définition traditionnelle d'un maître est de 10 000 heures d'expérience. Cela peut ne pas capturer complètement la "maîtrise" mais mon point est un modèle de programmation déclaratif et les actions personnalisées sont de loin le point d'échec le plus commun. –

+0

Je l'ai mis à jour avec le code source de la fonction Journal. Aussi, je ne comprends toujours pas pourquoi les actions personnalisées sont de loin le point d'échec le plus commun? C'est juste une simple action personnalisée qui écrit le journal et renvoie le succès. Merci – liorafar