8
votes

Comment détecter la première fois qu'une application déployée ClickOnce a été exécutée?

J'ai une application déployée ClickOnce et je l'utilise actuellement pour détecter la première fois qu'un nouveau déploiement est en cours d'exécution:

    public static bool IsFirstRun
    {
        get
        {
            if (!IsNetworkDeployed)
                return false; // not applicable == bool default value

            if (!File.Exists(VersionFileName))
                return true;

            return (GetLastRunVersion() != Version.ToString());
        }
    }

    public static void StoreCurrentVersion()
    {
        File.WriteAllText(VersionFileName, Version.ToString());
    }

    public static string GetLastRunVersion()
    {
        using (var stream = File.OpenText(VersionFileName))
        {
            return stream.ReadToEnd();
        }
    }

    public static string VersionFileName
    {
        get
        {
            StringBuilder filename = new StringBuilder(Files.LocalFilesPath);
            if (!filename.ToString().EndsWith(@"\"))
                filename.Append(@"\");
            filename.Append(@"versioninfo.dat");
            return filename.ToString();
        }
    }


3 commentaires

Votre solution semble un peu incomplète. Pouvez-vous expliquer la logique? La version fait-elle référence à la version d'assemblage? Comment StorecurrentVersion est-il utilisé?


Vous pouvez utiliser Path.combine au lieu d'un constructeur de cordes dans la propriété VersionFileName.


Vous devez stocker les résultats de la version informatiqueFileName dans un champ de support afin de ne pas le calculer plusieurs fois.


3 Réponses :


2
votes

Oui, ISFIRRUN est réinitialisé pour chaque version du programme ...

C'est l'exceptionnel de Microsoft:

La valeur de cette propriété est réinitialisée Chaque fois que l'utilisateur mises à niveau d'un version à la suivante. Si tu veux effectuer une opération seulement le très première fois toute version du L'application est exécutée, vous aurez besoin de effectuer un test supplémentaire, tel que Vérification de l'existence d'un fichier vous avez créé la première fois, ou stockez un drapeau à l'aide des paramètres d'application.

qui plus ou moins vous répondez ...


2 commentaires

Pas tout à fait ... La situation que je décris n'est pas la première fois que l'application est exécutée sur la machine - l'application est déjà installée, mais les mises à niveau de l'utilisateur manuellement au lieu de laisser la mise à jour automatique de ClickOnce.


@Calvin Fisher, je suis dans le même problème. Je vais essayer la réponse de Richard ci-dessus. Semble assez simple.



10
votes

Inclure un fichier supplémentaire dans votre installation ClickOnce appelée Justinstalled.txt (ou quelque chose). Chedk pour ce fichier lorsque l'application commence. Si vous trouvez cela le supprimez et exécutez n'importe quel code pour votre première exécution de ce déploiement. Le fichier restera manquant jusqu'au prochain déploiement / mise à niveau.


6 commentaires

La réponse est donc que ClickOnce n'a aucun moyen de distinguer entre une première installation et une installation de mise à niveau?


Si j'ai bien compris la question, vous voulez "détecter les deux conditions de manière fiable" qui n'est pas la même chose que "distinguer entre une installation de première installation et une installation de mise à niveau". En regardant le code, je pense que vous souhaitez simplement afficher des notes de version sur la première exécution après chaque installation. J'ai aussi compris que lorsque le code que vous avez devait travailler (selon MS Docs), cela ne le fait pas. Si j'ai mal compris, faites le moi savoir.


En d'autres termes: pour cliquer sur ClickOnce, si l'utilisateur va à Publish.htm et que les clics, l'installation n'a pas de problème si l'application est déjà installée ou non? ClickOnce interprétera toujours cela comme une première installation et il n'y a aucun moyen de détecter cette condition comme si vous pouvez détecter une mise à niveau automatique avec ApplicationDeployment.CurrentDeployment.fisprun ?


Pas assez. Vous avez dit "toujours interpréter comme une première installation" - devrait être "toujours interpréter comme première exécution (après l'installation ou la mise à niveau)". Ne confondez pas "première course" avec "première installation". ISFIRRUN signifie que c'est la première fois que l'utilisateur a exécuté l'application après une nouvelle installation ou une nouvelle mise à niveau (l'une ou l'autre). Il devrait être déclenché dans les deux scénarios, mais vous ne savez pas s'il s'agissait d'une première installation ou d'une première mise à niveau. Vous ne pouvez pas distinguer entre eux avec Isfirstrun.


Apparemment, il existe des bugs exceptionnels dans Isfirstrun. Voici un exemple sur Site de Microsoft .


Ma question était de savoir s'il existe également un moyen de détecter si l'application vient d'être installées pour la première fois, et il semble que la réponse soit un "no" retentissant. Non seulement cela, cela semble même comme Isfirstrun est de buggy selon ce lien (et est depuis 2009 ...) Donc, la méthode que vous décrivez ci-dessus sonne comme la meilleure solution pour toutes les conditions possibles sur lesquelles nous souhaitons détecter lorsque l'utilisateur exécute une nouvelle version pour la première fois.



1
votes
if (ApplicationDeployment.IsNetworkDeployed)
{
    ApplicationDeployment deployment = ApplicationDeployment.CurrentDeployment;

    if (deployment.IsFirstRun)
    {
        //Your Code Here....
    }
} 
See IsFirstRun Doc     

0 commentaires