it-swarm.com.de

Wie kann ich eine ClickOnce-Anwendung zurücksetzen?

Gibt es eine Möglichkeit (hacky will do), einem Benutzer zu erlauben, zu einer früheren Version einer ClickOnce network-implementierten Anwendung zurückzukehren?

Ich habe in den Dokumenten und in der API nachgesehen und es scheint keinen Weg zu geben. Sie können Wählen Sie selektiv aus, ob Sie ein Update durchführen möchten, aber sobald das Update abgeschlossen ist, gibt es anscheinend keinen Weg zurück.

44
Jan Bannister

ClickOnce verwendet die von Ihnen gesendete Version. Wenn Sie ihnen eine alte Version senden, wird ein Rollback auf diese alte Version durchgeführt.

Im Mai schrieb mein Kumpel David einen Artikel darüber, wie dies auf Benutzerbasis geschieht. Wir können jeden Benutzer buchstäblich auf eine andere Version setzen. Die Anwendung teilt der Datenbank sogar mit, welche Version der Benutzer wünscht, so dass sie theoretisch ihre Version ändern und dann die Anwendung einfach neu starten kann.

Feinkörnige Versionierung mit ClickOnce

18
Jonathan Allen

Sie können auf der Serverseite zu einer älteren Version zurückkehren, indem Sie die Server-Manifestdatei ändern. Wenn der Client die Anwendung neu startet, sieht er, dass er eine andere Version hat als die, was der Server als 'aktuelle' Version bezeichnet, und lädt die neue Version herunter. Diese Server-Manifestdatei verweist normalerweise immer auf die aktuellste Version, muss dies jedoch nicht. 

So ändern Sie es (ich habe mit Visual Studio 2008 veröffentlicht. Andere Versionen haben möglicherweise eine andere Struktur für Veröffentlichungsordner).

In demselben Ordner wie die publish.htm befindet sich ein XML Dokument mit dem Namen [appName].application. Dies ist die serverseitige Manifestdatei, mit der der Client die aktuelle Version vergleicht. In diesem Dokument enthalten ist die 'aktuelle' Version, die der Client ausführen soll, sowie der Speicherort auf dem Server, an dem die Implementierungsdateien gefunden werden können.

Am selben Ort wie publish.htm befindet sich auch ein Ordner mit dem Namen 'Anwendungsdateien'. Dieser Ordner enthält Unterordner für jede der vorherigen Veröffentlichungen. In jedem dieser Unterordner befindet sich ein weiteres XML-Dokument mit demselben Namen, den ich oben erwähnte, [appName].application. Kopieren Sie diese Datei (aus dem Ordner, in dem sich die Version befindet, in der Sie zurückkehren möchten) und fügen Sie sie in demselben Ordner wie publish.htm ein (einige Ebenen höher). Wenn die Clientanwendung neu gestartet wird, erscheint sie so, als wäre eine neue Version verfügbar. Laden Sie sie herunter und führen Sie sie aus. Der Client führt jetzt eine vorherige Version aus.

81
Jason Hornor

Sie können unter Anwendung hinzufügen/entfernen die Anwendung auswählen und stattdessen die letzte Installation auswählen.

7

Sie können MAGEUI verwenden, um ein Rollback zu einer früheren Manifestversion auf dem Server durchzuführen. Schau dir das an

2
Gulzar Nazim

Wenn Sie sich Ihren Bereitstellungsspeicherort ansehen, wird jede vorherige Version in einem separaten Ordner mit angehängter Versionsnummer sowie dem Bereitstellungsmanifest mit angehängter Versionsnummer angezeigt. 

Sie können jede davon umbenennen, sodass sie zur aktuellen Bereitstellung wird. Wenn Sie diese Anwendung das nächste Mal aktualisieren, wird die Version angezeigt, auf die Sie zurückgesetzt wurden.

1
rjrapson

Ich verstehe die ClickOnce-Versionsprüfung algorythm wie folgt:

  1. Wenn auf Client installierte Version = Version auf dem Server installiert ist, ist nichts zu tun
  2. Wenn Clientversion <Serverversion - Upgrade durchführen
  3. Wenn Clientversion> Serverversion:
    1. Wenn minimumVersion auf client> = Server-Version angegeben ist, zeigen Sie den Fehler wie wir ihn haben
    2. Wenn minimumVersion auf Client <Serverversion angegeben ist - Downgrade
    3. Wenn minimumVersion beim Client-Downgrade nicht angegeben ist
1

Dies kann über Reflektion erfolgen, wenn Sie den Herausgeber URI und den Namen, den öffentlichen Schlüssel und die Prozessorarchitektur der Versionssprache der Bereitstellung und der Anwendung kennen.

Der folgende Code versucht, die Anwendung "coolapp.app" ClickOnce "zurückzusetzen. Wenn kein Rollback möglich ist, wird versucht, es zu deinstallieren.

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

namespace ClickOnceAppRollback
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        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 });
            }
        }
    }
}
0

Verwenden Sie diese Option nur, um eine in Visual Studio 2017 entwickelte Anwendung clickonce rückgängig zu machen. In meinem Fall befanden sich im Stammordner nur zwei Dateien. eines heißt [applicationName] .manifest, das andere setup.exe.

Das Manifest [applicationName] enthielt eine Anzahl von Referenzen auf die aktuelle Versionsnummer, die jedoch jeweils mit einem publicKeyToken-Wert verknüpft waren. Daher wollte ich ihn nicht manuell bearbeiten.

Also fand ich im Ordner "Anwendungsdateien" unter dem Unterordner mit der Version, zu der ich zurückkehren wollte, ein anderes [applicationName] .manifest, das ich in den Stammordner kopiert hatte (nachdem das Original gesichert wurde).

Und das war es. Es hat für mich funktioniert und war eine wirklich einfache Lösung. Ich verwende jedoch keine Mindestversion, daher kann ich nicht sagen, ob dies davon betroffen wäre.

0
Jon Roberts

Ich musste nur eines davon auf meinem Live-Produktionsserver machen, und es war schön, all diese Notizen zu haben. Meine Lösung war etwas anders und ich wollte das auch als Fix hinzufügen. Bevor ich eine Produktionsbereitstellung durchführe, mache ich immer ein Backup des gesamten enthaltenen Ordners. Ich konnte meine gesamte Ordnerstruktur in ihren ursprünglichen Zustand zurückkopieren und alles funktionierte einwandfrei.

Hinweise zur Vorsicht bei dieser Methode:

  • Ihre Sicherung ist umfangreich, wenn die Anwendung recht umfangreich ist oder bereits viele Versionen im Ordner der Anwendungsdateien veröffentlicht sind. Stellen Sie sicher, dass Sie genügend Platz haben (für mich ist Lagerung kein Objekt).
  • Berechtigungen neigen dazu, dich auf diese Weise zu beißen. Stellen Sie sicher, dass Ihr Bereitstellungsspeicherort für den externen Zugriff gehostet ist, und überprüfen Sie alle Berechtigungen vor und nach der Wiederherstellung.
  • Es war hilfreich für mich, meinen Anwendungspool in ISIS zu recyceln.
0
Mathew A.