Question

Nous avons décidé d'utiliser la version minimumRequiredVersion dans notre manifeste d'application ClickOnce. Désormais, lorsque nous essayons de revenir à une version précédente lorsque l'utilisateur lance l'application, son démarrage échoue. Il indique que le manifeste d'application a une version antérieure à la version requise et que l'utilisateur ne peut pas utiliser l'application. Nous n’avions pas ce problème avec minimumRequiredVersion, mais nous aimerions l’utiliser.

Était-ce utile?

La solution

Vous devez déployer une nouvelle version avec un numéro de version supérieur. Il n’existe pas de fonctionnalité intégrée de restauration.

Autres conseils

Vous pouvez utiliser Mage.exe pour mettre à jour votre manifeste de déploiement (extension de fichier .application) vers une version supérieure, puis sélectionner le manifeste d'application de la version précédente. Comme dit chilltemp, vous devez toujours utiliser une version supérieure, mais vous n'avez pas à redéployer votre code.

Si vous souhaitez restaurer la version précédente avant la version minimale requise du client, vous devez alors réinstaller l'application clickonce.

Jetez un coup d'œil à ce lien pour voir comment cela peut être fait dans le code: ClickOnce et Certificats de signature de code expirés

Cela peut être fait par réflexion si vous connaissez l'éditeur URI et le nom, le jeton de clé publique de langue de version et l'architecture de processeur du déploiement et de l'application.

Le code ci-dessous va essayer de restaurer le "coolapp.app" cliquez une fois app. S'il ne peut pas revenir en arrière, il tentera de le désinstaller.


using System;
using System.Deployment.Application;
using System.Reflection;

namespace ClickOnceAppRollback
{
    static class Program
    {
        /// 
        /// The main entry point for the application.
        /// 
        static void Main()
        {
            string appId = string.Format("{0}#{1}, Version={2}, Culture={3}, PublicKeyToken={4}, processorArchitecture={5}/{6}, Version={7}, Culture={8}, PublicKeyToken={9}, processorArchitecture={10}, type={11}",
                /*The URI location of the app*/@"http://www.microsoft.com/coolapp.exe.application",
                /*The application's assemblyIdentity name*/"coolapp.app",
                /*The application's assemblyIdentity version*/"10.8.62.17109",
                /*The application's assemblyIdentity language*/"neutral",
                /*The application's assemblyIdentity public Key Token*/"0000000000000000",
                /*The application's assemblyIdentity processor architecture*/"msil",
                /*The deployment's dependentAssembly name*/"coolapp.exe",
                /*The deployment's dependentAssembly version*/"10.8.62.17109",
                /*The deployment's dependentAssembly language*/"neutral",
                /*The deployment's dependentAssembly public Key Token*/"0000000000000000",
                /*The deployment's dependentAssembly processor architecture*/"msil",
                /*The deployment's dependentAssembly type*/"win32");

            var ctor = typeof(ApplicationDeployment).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(string) }, null);
            var appDeployment = ctor.Invoke(new object[] { appId });

            var subState = appDeployment.GetType().GetField("_subState", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(appDeployment);
            var subStore = appDeployment.GetType().GetField("_subStore", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(appDeployment);
            try
            {
                subStore.GetType().GetMethod("RollbackSubscription").Invoke(subStore, new object[] { subState });
            }
            catch
            {
                subStore.GetType().GetMethod("UninstallSubscription").Invoke(subStore, new object[] { subState });
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top