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();
}
}
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
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. –
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