Как я могу отменить clickOnce, если у меня есть минимально необходимая версия?

StackOverflow https://stackoverflow.com/questions/241541

  •  04-07-2019
  •  | 
  •  

Вопрос

Мы решили использовать MinimeRequiredVersion в нашем манифесте приложения clickOnce, и теперь, когда мы пытаемся выполнить откат к предыдущей версии, когда пользователь запускает приложение, оно не запускается. В нем говорится, что манифест приложения имеет более раннюю версию, чем требуемая версия, и пользователь не может использовать приложение. У нас не было этой проблемы с минимальной требуемой версией, но мы хотели бы использовать это.

Это было полезно?

Решение

Вы должны развернуть новую версию с более высоким номером версии. Нет встроенной функции отката.

Другие советы

Вы можете использовать Mage.exe для обновления манифеста развертывания (расширение файла приложения) до более поздней версии и выбрать манифест приложения предыдущей версии. Как сказал Chilltemp, вам все равно нужно перейти на более высокую версию, но вам не нужно повторно развертывать свой код.

Если вы хотите откатить версию до предыдущей до того, как клиенту потребуется минимальная требуемая версия, вам потребуется переустановить приложение clickonce.

Посмотрите эту ссылку, чтобы увидеть, как это можно сделать в коде: ClickOnce и Сертификаты подписи кода с истекающим сроком действия

Это можно сделать с помощью отражения, если вы знаете uri издателя и его имя, маркер открытого ключа языка версии и архитектуру процессора как развертывания, так и приложения.

В приведенном ниже коде будет предпринята попытка отката файла " coolapp.app " нажмите один раз приложение. Если он не сможет выполнить откат, он попытается удалить его.


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 });
            }
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top