
Ein leicht anpassbares Software-Update-Framework für C# .NET-Projekte mit integrierten Benutzeroberflächen für WinForms, WPF und Avalonia
NetSparkle is a highly-configurable software update framework for C# that is compatible with .NET 6+ and .NET Framework 4.6.2+, has pre-built UIs for .NET Framework (WinForms, WPF) and .NET 6+ (WinForms, WPF, Avalonia), uses Ed25519 or other cryptographic signatures, and even allows for custom UIs or no built-in UI at all! Sie bieten irgendwo im Internet eine App mit Update- und Versionsinformationen sowie Versionshinweise im Markdown- oder HTML -Format an. Diese Bibliothek hilft Ihnen dann, nach einem Update zu suchen, dem Benutzer die Versionshinweise anzuzeigen und die neue Version der Software herunterzuladen/zu installieren.
Integrierte unterstützte Update-Download-Typen:
Weitere Informationen zu Hauptversionsänderungen, Updates usw. finden Sie unter upgrade.md.md.
Netsparkle ist über Nuget erhältlich. Um ein Nuget -Paket zu wählen, um zu verwenden:
NetSparkleUpdater.SparkleUpdater package Wenn Sie sich nicht um eine integrierte Benutzeroberfläche kümmern und die Dinge selbst verwalten können| Paket | Anwendungsfall | Freigeben | Vorschau | Downloads |
|---|---|---|---|---|
| NetsparkleUpdater.sparkleUpdater | Kernpaket; Verwenden Sie eine 100% benutzerdefinierte Benutzeroberfläche oder keine Benutzeroberfläche (nichts integriert) | |||
| Winforms UI (.NET Framework) | Netsparkle mit eingebauter WinForms-Benutzeroberfläche | |||
| Winforms UI (.NET 6+) | Netsparkle mit eingebauter WinForms-Benutzeroberfläche | |||
| WPF UI (.NET Framework und .NET 6+) | Netsparkle mit integrierter WPF-Benutzeroberfläche | |||
| Avalonia ui | Netsparkle mit eingebauter Avalonia UI | |||
| App Cast Generator Tool | netsparkle-generate-appcast CLI Tool (inkl. ED25519 Helpers) | |||
| DSA -Helfer -Werkzeug | netsparkle-dsa CLI Tool (DSA-Helfer) |
Schnelle Infos für Tool -Installationen:
dotnet tool install --global NetSparkleUpdater.Tools.AppCastGenerator ; Erhältlich als netsparkle-generate-appcast in Ihrer Befehlszeile nach der Installationdotnet tool install --global NetSparkleUpdater.Tools.DSAHelper ; Erhältlich als netsparkle-dsa in Ihrer Befehlszeile nach der Installation Ein typischer Software -Update -Pfad für eine stereotype Software sieht möglicherweise so aus:
dotnet publish )Im Moment hilft NetSparkleUpdater Ihnen nicht mit 1., 2. oder 4. "Warum nicht?", Vielleicht fragen Sie:
sudo laufen müssen, gibt es ein Beispiel dafür in der Stichprobe von macos Avalonia .Um Ihre App Cast -Datei zu erstellen, finden Sie im Abschnitt App Cast dieses Dokuments.
Wir sind offen für Beiträge, die den allgemeinen Installations-/Update -Prozess für den Benutzer erleichtern. Bitte geben Sie zuerst ein Problem mit Ihrer Idee vor, bevor Sie mit der Arbeit beginnen, damit wir darüber sprechen können.
Bitte sehen Sie sich die Beispielprojekte in diesem Repository für grundlegende, ausgeführte Nutzungsmuster an !! Es gibt Beispiele für die Verwendung der einzelnen integrierten Benutzeroberflächen sowie eine "Mach es selbst in deiner eigenen Benutzeroberfläche"!
dotnet tool install --global NetSparkleUpdater.Tools.AppCastGeneratornetsparkle-generate-appcast --generate-keys
# By default, your Ed25519 signatures are stored on disk in your local
# application data folder in a subdirectory called `netsparkle`.
# If you want to export your keys to the console, you can do:
netsparkle-generate-appcast --exportMainWindow oder Hauptformular oder ähnliches Code ähnlich wie folgt hinzu: private SparkleUpdater _sparkle ;
// on your main thread...
_sparkle = new SparkleUpdater (
"https://mywebsite.com/appcast.xml" , // link to your app cast file - change extension to .json if using json
new Ed25519Checker ( SecurityMode . Strict , // security mode -- use .Unsafe to ignore all signature checking (NOT recommended!!)
"base_64_public_key_from_generate_app_cast_tool" ) // your base 64 public key
) {
UIFactory = new NetSparkleUpdater . UI . WPF . UIFactory ( icon ) , // or null, or choose some other UI factory, or build your own IUIFactory implementation!
RelaunchAfterUpdate = false , // set to true if needed
} ;
_sparkle . StartLoop ( true ) ; // will auto-check for updatesInnoSetup (Windows), einer DMG -Datei (Linux), einer .tar.gz -Datei (Linux) oder ähnlichem. Weitere Informationen im Abschnitt "Wie Updates funktionieren".netsparkle-generate-appcast --help für Optionen): netsparkle-generate-appcast -b binary/folder -p change/log/folder -u https://example.com/downloads -l https://example.com/downloads/changelogs.signature oder ähnlichen Dateien) in die entsprechenden Stellen Ihres Servers hochSparkleUpdater.LogWriter zu verwenden, um festzustellen, ob hilfreiche Debug -Informationen auf der Konsole angezeigt werden! Stellen Sie in Ihrer Projektdatei sicher, dass Sie ein paar Dinge einrichten, damit die Bibliothek später in den relevanten Details lesen kann. Hinweis: Sie können Ihren eigenen IAssemblyAccessor verwenden, um Versionsinformationen von irgendwo anders zu laden. Das Einrichten in Ihrer Projektdatei ist jedoch einfach, und NetSparkleUpdater kann dies nativ lesen!
< PropertyGroup >
< Version >1.0.2-beta1</ Version > <!-- accepts semver -->
< AssemblyVersion >1.0.2</ AssemblyVersion > <!-- only accepts Major.Minor.Patch.Revision -->
< AssemblyTitle >My Best App</ AssemblyTitle >
<!-- When using AssemblyDiagnosticsAccessor, accessor.AssemblyTitle is actually the
<Product> information due to limitations with the way the diagnostics access works -->
< Description >My app is cool (not required)</ Description >
< Company >My Company Name (required unless you set the IAssemblyAccessor save path yourself)</ Company >
< Product >My Product (required unless you set the IAssemblyAccessor save path yourself; set to product name e.g. MyBestApp)</ Product >
< Copyright >2024 MyCompanyName</ Copyright >
</ PropertyGroup > Wichtiger Hinweis: In .NET 8+ wurde im Kern von .NET eine Änderung vorgenommen, die dazu führt, dass Ihr Git/Quell -Code -Komitee Hash in <Version> versionsnummer Ihrer App aufgenommen wird. Dieses Verhalten kann zu diesem Zeitpunkt von NetSparkleUpdater nicht vermieden werden, da wir uns auf AssemblyInformationalVersionAttribute verlassen, und das Verhalten dieses Attributs wurde geändert. Mögen Sie Ihren Benutzern mitgeteilt werden, dass sie derzeit 1.0.0+commitHashHere von NetSparkleUpdater (und Ihrer nativen App selbst!) Ausführen. Wir empfehlen außerdem, Ihre Projektdatei (in einer neuen <PropertyGroup> oder einer vorhandenen) die folgenden Zeilen hinzuzufügen:
< IncludeSourceRevisionInInformationalVersion >false</ IncludeSourceRevisionInInformationalVersion > // NOTE: Under most, if not all, circumstances, SparkleUpdater should be initialized on your app's main UI thread.
// This way, if you're using a built-in UI with no custom adjustments, all calls to UI objects will automatically go to the UI thread for you.
// Basically, SparkleUpdater's background loop will make calls to the thread that the SparkleUpdater was created on via SyncronizationContext.
// So, if you start SparkleUpdater on the UI thread, the background loop events will auto-call to the UI thread for you.
_sparkle = new SparkleUpdater (
"http://example.com/appcast.xml" , // link to your app cast file
new Ed25519Checker ( SecurityMode . Strict , // security mode -- use .Unsafe to ignore all signature checking (NOT recommended!!)
"base_64_public_key" ) // your base 64 public key -- generate this with the NetSparkleUpdater.Tools.AppCastGenerator .NET CLI tool on any OS
) {
UIFactory = new NetSparkleUpdater . UI . WPF . UIFactory ( icon ) , // or null, or choose some other UI factory, or build your own IUIFactory implementation!
RelaunchAfterUpdate = false , // default is false; set to true if you want your app to restart after updating (keep as false if your installer will start your app for you)
CustomInstallerArguments = "" , // set if you want your installer to get some command-line args
} ;
_sparkle . StartLoop ( true ) ; // `true` to run an initial check online -- only call StartLoop **once** for a given SparkleUpdater instance!Bei der ersten Anwendung.IDLE -Veranstaltung wird Ihre App -Cast XML -Datei heruntergeladen, gelesen und mit der aktuell ausgeführten Version verglichen. Wenn es ein Software -Update im Inneren enthält, wird der Benutzer mit einer kleinen Toastbenachrichtigung (falls von der Benutzeroberfläche unterstützt und aktiviert) oder mit einem Update -Dialog mit Ihren Versionshinweise informiert. Der Benutzer kann dann das Update ignorieren, später erinnern oder jetzt herunterladen/installieren.
Wenn Sie nach einem Update im Hintergrund suchen möchten, ohne dass der Benutzer etwas sieht, verwenden Sie
var updateInfo = _sparkle . CheckForUpdatesQuietly ( ) ;Wenn Sie einen Menüelement haben möchten, mit dem der Benutzer nach Updates suchen kann, damit der Benutzer die Benutzeroberfläche sehen kann, während NetSparkle nach Updates sucht, verwenden Sie die Verwendung
_sparkle . CheckForUpdatesAtUserRequest ( ) ;Wenn Sie Dateien haben, die gespeichert werden müssen, abonnieren Sie das Ereignis vorbereitet:
_sparkle . PreparingToExit += ( ( x , cancellable ) =>
{
// ask the user to save, whatever else is needed to close down gracefully
} ) ; Beachten Sie, dass Sie die CloseApplication oder CloseApplicationAsync -Ereignisse verwenden müssen , um Ihre Anwendung zu schließen, wenn Sie keine UIFactory verwenden. Andernfalls wird Ihre heruntergeladene Update -Datei niemals ausgeführt/gelesen! Die einzige Ausnahme ist, wenn Sie alle Aspekte der Installation des Update -Pakets selbst verarbeiten möchten.
Die Datei, mit der Ihr heruntergeladenes Update ausführbar gestartet wird, wartet nur 90 Sekunden vor dem Aufgeben! Stellen Sie sicher, dass Ihre Software innerhalb von 90 Sekunden nach dem Aufrufen dieser Ereignisse innerhalb von 90 Sekunden nach dem Implementieren dieser Ereignisse geschlossen wird! Wenn Sie ein Ereignis benötigen, das storniert werden kann, PreparingToExitAsync PreparingForExit
IUIFactory . Setzen Sie SparkleUpdater.UIFactory , um eine Instanz Ihres Objekts zu verwenden.ICheckingForUpdates für Ihre Benutzeroberfläche, die dem Benutzer mitteilt, dass SparkleUpdater nach Updates checktIDownloadProgress für Ihre Benutzeroberfläche, die dem Benutzer zeigt, dass ein Update heruntergeladen wirdIUpdateAvailable für Ihre Benutzeroberfläche, die dem Benutzer zeigt, dass ein Update zusammen mit Versionshinweise verfügbar istIAppCastDataDownloader , um Ihre eigenen Methoden zum Herunterladen von App -Cast -Daten einzurichten. Set SparkleUpdater.AppCastDataDownloader , um eine Instanz Ihres Objekts zu verwenden. NetSparkle enthält standardmäßig zwei Implementierungen: WebRequestAppCastDataDownloader zum Herunterladen von App -Castinformationen aus dem Internet und LocalFileAppCastDownloader zum Kopieren/"Herunterladen" einer App -Besetzung aus einem gegebenen Pfad aus einem bestimmten Pfad, das aus einem bestimmten Pfad besetzt ist, von einem bestimmten Pfad Cast aus einem bestimmten Path -Pfad Cast aus einem bestimmten Path -Pfad Cast aus einem bestimmten Path -Path -Path.IAppCastFilter , um die benutzerdefinierte Filterung in den AppCastItem -Objekten in Ihrem heruntergeladenen App -Cast durchzuführen, z. B. um eine bestimmte Teilmenge von Elementen als gültige Aktualisierungen für Ihre Anwendung zu betrachten. Setzen Sie AppCastHelper.AppCastFilter ( SparkleUpdater.AppCastHelper.AppCastFilter ), um eine Instanz Ihres Objekts zu verwenden. NetSparkle enthält die ChannelAppCastFilter -Klasse, mit der Sie Elemente nach einem bestimmten Produktkanal (z. B. Alpha, Beta) herausfiltern können, wenn Ihre Anwendung diese Funktionen verwendet.IAppCastGenerator , um zu steuern, wie App -Casts serialisiert und deserialisiert werden. Stellen Sie SparkleUpdater.AppCastGenerator fest, um eine Instanz Ihres Objekts zu verwenden. NetSparkle enthält zwei Implementierungen: XMLAppCastGenerator für XML -Serialisierung/Deserialisierung; und JsonAppCastGenerator für JSON -Serialisierung/Deserialisierung. Das App Cast Generator CLI Tool kann auch sowohl XML- als auch JSON -App -Casts ausgeben.IAssemblyAccessor , um zu steuern, wie Version, Urheberrecht und andere Produktdetails für Ihre Anwendung geladen werden. Setzen Sie Configuration.AssemblyAccessor ( SparkleUpdater.Configuration.AssemblyAccessor ), um eine Instanz Ihres Objekts zu verwenden. NetSparkle enthält eine Standardimplementierung, AssemblyDiagnosticsAccessor , die im allgemeinen Fall von Ladedaten aus einer bestimmten Baugruppe funktionieren sollte.ILogger und setzen Sie SparkleUpdater.LogWriter . Standardmäßig wird die LogWriter -Klasse verwendet (mit der LogWriterOutputMode -Eigenschaft, um zu steuern, ob die Protokolle in Console , Trace usw. geschrieben werden)ISignatureVerifier um die Art und Weise zu ändern, wie Ihre Unterschriften für die App -Besetzung, Downloads usw. behandelt werden. Setzen Sie SparkleUpdater.SignatureVerifier , um eine Instanz Ihres Objekts zu verwenden.IUpdateDownloader um Ihre eigenen Methoden zum Herunterladen und Senden von Fortschritten in App -Update -Dateien (z. B. Installateuren) für ein bestimmtes App -Cast -Element zu senden. Setzen Sie SparkleUpdater.UpdateDownloader , um eine Instanz Ihres Objekts zu verwenden. NetSparkle enthält standardmäßig zwei Implementierungen: WebFileDownloader (Standard) zum Herunterladen von Dateien aus dem Web/Internet und LocalFileDownloader zum Kopieren/"Herunterladen" einer Datei von einem bestimmten Pfad. Configuration , um zu ändern, wie bestimmte Netsparkle -Informationen gespeichert und geladen werden - z. B. übersprungene Versionsinformationen. Diese Klasse ist diejenige, die RegistryConfiguration IAssemblyAccessor -Instanz verwendet, um Versionsinformationen, Produktname usw. zu speichern und zu laden. JSONConfiguration , das Informationen in einer JSON -Datei speichert und lädt (Standardeinstellung auf MacOS/Linux); und DefaultConfiguration , die nichts bewirkt und als Fallback dient, falls JSONConfiguration keinen gültigen Dateispeicherort zum Speichern und Laden von Daten finden kann. Um die Instanz Ihrer Klasse zu verwenden, setzen Sie SparkleUpdater.Configuration .RegistryConfiguration können Sie schnell den Registrierungsweg ändern, in dem Elemente über BuildRegistryPath gespeichert werdenJSONConfiguration können Sie schnell den Dateipfad ändern, in dem Daten über GetSavePath gespeichert werdenAppCastHelper Wenn Sie die vollständige Kontrolle über den App -Cast -Download- und Parsingprozess für Apps wünschen. Beachten Sie, dass Sie wahrscheinlich alles tun können, was Sie über die AppCastHelper -Eigenschaften (einschließlich IAppCastFilter AppCastFilter ) tun müssen, aber die Subklasser bietet Ihnen die volle, absolute Kontrolle über den gesamten Prozess. Um die Instanz Ihrer Klasse zu verwenden, setzen Sie SparkleUpdater.AppCastHelper .ReleaseNotesGrabber zur Steuerung des Herunterladens von Versionshinweisen (und daher anzeigen). Um eine Instanz Ihrer Klasse zu verwenden, setzen Sie UIFactory.ReleaseNotesGrabberOverride .WebFileDownloader , wenn Sie IUpdateDownloader nicht selbst implementieren möchten und nur ein oder zwei Funktionen überschreiben möchten, RetreiveDestinationFileNameAsync CreateHttpClient Um eine Instanz Ihrer Klasse zu verwenden, setzen Sie SparkleUpdater.UpdateDownloader .WebRequestAppCastDataDownloader , wenn Sie IAppCastDataDownloader nicht implementieren möchten und nur ein oder zwei Funktionen überschreiben möchten, z. B. CreateHttpClient . Um eine Instanz Ihrer Klasse zu verwenden, setzen Sie SparkleUpdater.AppCastDataDownloader .LogWriter , um die PrintMessage -Funktion zu implementieren. Da ILogger eine ziemlich einfache Schnittstelle ist, können Sie diese Schnittstelle wahrscheinlich selbst implementieren, wenn Ihre Anforderungen komplex sind. Um eine Instanz Ihrer Klasse zu verwenden, setzen Sie SparkleUpdater.LogWriter .SparkleUpdater , um einige unterschiedliche Installationsfunktionen zu implementieren, darunter:GetWindowsInstallerCommandGetInstallerCommandRunDownloadedInstallerGetDownloadPathForAppCastItemUIFactory wenn Sie nicht die gesamte IUIFactory -Schnittstelle selbst implementieren möchten und nur ein oder zwei Funktionen konfigurieren möchten. Um eine Instanz Ihrer Klasse zu verwenden, setzen Sie SparkleUpdater.UIFactory . IAppCastFilter Sie können die Art und Weise ändern, wie Ihre App -Cast -Elemente über die Eigenschaft AppCastHelper.AppCastFilter (über die IAppCastFilter -Schnittstelle) gefiltert werden. Auf diese Weise können Sie ändern, welche Elemente Ihren Endbenutzern zur Verfügung gestellt werden.
NetSparkle enthält eine integrierte IAppCastFilter -Implementierung für die kanalbasierte Filterung namens ChannelAppCastFilter . Einige Beispiele zur Verwendung dieser Klasse finden Sie in den Unit -Tests hier. Setzen Sie im Grunde die Eigenschaft List<string> ChannelSearchNames auf die Kanäle, nach denen Sie filtern möchten. Wenn Sie Elemente ohne Kanalinformationen (z. B. 1.2.3 ) behalten möchten, setzen Sie KeepItemsWithNoChannelInfo auf true fest.
Verwenden Sie die Kanäle in Ihren App-Cast-Elementen / in Ihrer App-Cast die --channel des App Cast CLI-Tools <Version> die Eigenschaft Ihrer Projektdatei auf die zutreffende Semver-kompatible Version (zB <Version>1.0.2-beta1</Version> >) und das App-Cast-CLI-Tool wird dies automatisch erfasst. Oder, wenn Sie Ihre App manuell erstellen, stellen Sie die <sparkle:channel>YourChannelHere</sparkle:channel> -Mobilie auf Ihrem <item> (oder bei Verwendung von JSON die channel -Eigenschaft) ein.
NetSparkleUpdater muss überhaupt nicht mit einer Benutzeroberfläche verwendet werden. Sie können alles selbst ausführen oder sogar die Bibliothek Ihr heruntergeladenes Update automatisch ausführen lassen, indem Sie den SparkleUpdater.UserInteractionMode = UserInteractionMode.DownloadAndInstall einstellen. Dieses Repo hat ein Beispiel, um Dinge selbst ohne vorgefertigte Benutzeroberfläche in SRC/Netsparkle.Sampules.HandleEventyourself zu tun.
Wenn Sie eine Benutzeroberfläche wünschen, bieten wir vorgefertigte Benutzeroberflächen in verschiedenen Nuget-Paketen mit einer kleinen Anzahl an anpassbarer Optionen für WinForms, WPF und Avalonia an. Die Benutzeroberfläche wird über eine IUIFactory Implementierung ausgelöst, die in jeder der integrierten Optionen UIFactory bezeichnet wird. Die meisten Methoden in der UIFactory können überschrieben werden, wenn Sie das Verhalten optimieren möchten, und mit dem ProcessWindowAfterInit können Sie jedes Fenster nach dem Erstellen anpassen.
Wenn Sie Ihre eigene Benutzeroberfläche vollständig rollen möchten, implementieren Sie einfach die IUIFactory -Schnittstelle mit jeder UI -Bibliothek, die Sie verwenden möchten. Sie können Modelle, Code usw. Ansicht oder Wiederverwendung von den vorgebauten Optionen von NetSparkleUpdater und kopieren+CODE von diesem Repo in Ihre eigenen kopieren. Vergessen Sie nicht, die SparkleUpdater.UIFactory -Eigenschaft mit einer Instanz Ihrer IUIFactory -Implementierung festzulegen!
Bitte beachten Sie: NetSparkle unternimmt im Grunde keine Versuche, sich um das Threading zu kümmern (z. B. zum Haupt -Thread), mit Ausnahme der Hintergrundschleife, die zum Haupt -Thread aufgerufen wird, mit dem die SparkleUpdater -Instanz gestartet wurde. Mit anderen Worten, im Allgemeinen wird NetSparkle alles auf dem Thread tun, das ursprünglich die SparkleUpdater -Instanz erstellt hat. Für die meisten Apps wird dies in Ordnung sein, da sie nur ihren Haupt -UI -Thread verwenden. Stellen Sie im Zweifelsfall für Ihre eigenen Benutzeroberflächenbedürfnisse sicher, dass Sie auf Winforms InvokeRequired und auf WPF/Avalonia die Dinge in den UI -Thread marschieren (es sei denn, Sie verwenden Datenbindung. In diesem Fall wird es für Sie gehandhabt!).
Wenn Sie Ihre eigene IUIFactory -Implementierung übergeben, die Windows/Dinge auf neuen Threads in SparkleUpdater startet, ist keine unterstützte Konfiguration. Wenn Sie Ihre eigene Benutzeroberfläche auf mehreren Threads ausführen möchten (z. B. für WinForms, um nicht über die Fenster von NetSparkleUpdater zu verfügen, wenn das Hauptformular schließt), verwenden Sie dies mit den Ereignissen von SparkleUpdater und nicht der UIFactory . Bitte sehen Sie auch die SRC/NETSPARKLE.SAMPLE.FORMENS.Multithread -Probe für ein praktisches Beispiel dafür.
Die App -Besetzung ist nur eine XML- oder JSON -Datei. Es enthält Felder wie den Titel und die Beschreibung Ihres Produkts sowie eine Definition pro Version Ihrer Software.
Wir empfehlen dringend, dass Sie das NetSparkle-Generate-Appcast-Tool verwenden, um die Datei zu erstellen (und später neu zu erstellen/zu aktualisieren), da sie dazu beitragen kann, alle Anforderungen an die Unterzeichnung für Sie zu erfüllen.
dotnet tool install --global NetSparkleUpdater.Tools.AppCastGeneratornetsparkle-generate-appcast verfügbar. Sie können netsparkle-generate-appcast --help verwenden, um eine vollständige Liste der Optionen für dieses Tool anzuzeigen. Standardmäßig verwendet NetSparkle größtenteils Sparkle-kompatible XML-App-Apps. NetSparkle verwendet sparkle:signature statt sparkle:edSignature damit Sie auswählen können, wie Sie Ihre Dateien/App -Guss unterschreiben. (Wenn Sie sparkle:edSignature , Pass --use-ed25519-signature-attribute an den App-Gussgenerator verwenden möchten.) Beachten Sie, dass Netsparkle mit ED255519-Signaturen kompatibel ist und die Signaturen standardmäßig mit einer Differenzierung der ISignatureVerifier -Klasse über die Signaturen-Signaturen-Signaturen-Signaturen-Signaturen überprüft.
Hier ist eine Beispiel -XML -App -Besetzung:
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< rss xmlns : dc = " http://purl.org/dc/elements/1.1/ " xmlns : sparkle = " http://www.andymatuschak.org/xml-namespaces/sparkle " version = " 2.0 " >
< channel >
< title >NetSparkle Test App</ title >
< link >https://netsparkleupdater.github.io/NetSparkle/files/sample-app/appcast.xml</ link >
< description >Most recent changes with links to updates.</ description >
< language >en</ language >
< item >
< title >Version 2.0 (2 bugs fixed; 3 new features)</ title >
< sparkle : releaseNotesLink >
https://netsparkleupdater.github.io/NetSparkle/files/sample-app/2.0-release-notes.md
</ sparkle : releaseNotesLink >
< pubDate >Thu, 27 Oct 2016 10:30:00 +0000</ pubDate >
< enclosure url = " https://netsparkleupdater.github.io/NetSparkle/files/sample-app/NetSparkleUpdate.exe "
sparkle : version = " 2.0 "
sparkle : os = " windows "
length = " 12288 "
type = " application/octet-stream "
sparkle : signature = " NSG/eKz9BaTJrRDvKSwYEaOumYpPMtMYRq+vjsNlHqRGku/Ual3EoQ== " />
</ item >
</ channel >
</ rss > NetSparkle liest die <item> -Tags, um festzustellen, ob Aktualisierungen verfügbar sind.
Die wichtigen Tags in jedem <item> sind:
<description><sparkle:releaseNotesLink> Tag.<sparkle:releaseNotesLink><description> vorhanden ist, wird es stattdessen verwendet.sparkle:signature , optional: Die DSA/ED25519 Signatur des Dokuments; NetSparkle true diese Signatur nur für Sie, es sei denn ReleaseNotesGrabber.ChecksReleaseNotesSignature = true Sie haben ReleaseNotesGrabber.ChecksReleaseNotesSignature festgelegt.<pubDate>sparkle:channel : Channel für dieses App -Gusselement, z. B. beta (nicht erforderlich) - Akzeptiert nur 1 Kanal<enclosure>url : URL der Aktualisierungsdateisparkle:version : Maschinenlesbare Versionsnummer dieses Updateslength , optional: (nicht validiert) Größe der Aktualisierungsdatei in Bytestype : Ignoriertsparkle:signature : DSA/ED25519 Signatur der Aktualisierungsdateisparkle:criticalUpdate , optional: Wenn gleich oder true gleich oder 1 , zeigt die Benutzeroberfläche an, dass dies ein kritisches Update istsparkle:os : Betriebssystem für das App -Cast -Element. Standardmäßig zu Windows, wenn sie nicht geliefert werden. Verwenden Sie für Windows "Win" oder "Windows". Verwenden Sie für macOS "macOS" oder "osx"; Verwenden Sie für Linux "Linux". Standardmäßig benötigen Sie 2 Unterschriften ( SecurityMode.Strict ):
sparkle:signature="..." )HINWEIS: Das App Cast Generator -Tool erstellt beide Signaturen für Sie, wenn es die Datei Appcast.xml neu erstellt.
Sie können ED25519 -Signaturen mit dem AppCastGenerator -Tool (aus diesem Nuget -Paket oder im Quellcode hier) generieren. Für dieses Tool müssen die Desktop -Laufzeit von .NET 6, 7, 8 oder 9 installiert werden. In den folgenden Abschnitten finden Sie Optionen und Beispiele zum Generieren der ED25519 -Tasten und zum Erstellen eines App -Casts.
AppCastGenerator -Tool (aus diesem Nuget -Paket oder im Quellcode hier), um Ihre App Cast -Datei einfach zu erstellen. Die verfügbaren Optionen werden nachstehend beschrieben. Sie können es auf Ihrer CLI über dotnet tool install --global NetSparkleUpdater.Tools.AppCastGenerator .string.Format oder ähnliches ist eine wunderbare Sache).Wenn Sie eine JSON -App -Besetzung verwenden möchten und nicht XML:
--output-type json , wenn Sie Ihre App-Cast-Datei über den App Cast Generator generierenSparkleUpdater.AppCastGenerator auf new JsonAppCastGenerator(mySparkleUpdater.LogWriter) .JsonAppCastGenerator.HumanReadableOutput auf false .Fehlen eine Option, die Sie gerne sehen möchten? Stellen Sie ein Problem in diesem Repo ein oder fügen Sie es selbst hinzu und senden Sie uns eine Pull -Anfrage!
--show-examples : Druckbeispiele für die Nutzung in die Konsole.--help : Zeigen Sie alle Optionen und ihre Beschreibungen an. -a / --appcast-output-directory : Verzeichnis, in dem die Datei Ausgabe appcast.xml geschrieben werden soll. Beispiel Verwendung: -a ./MyAppCastOutput-e / --ext : Wenn Sie nach Dateien suchen, die Sie dem App -Cast hinzufügen können, verwenden Sie die angegebene Erweiterung (n) bei der Suche nach Dateien. Standardmäßig exe . Beispiel Verwendung: -e exe,msi-b / --binaries : Dateipfad zum Verzeichnis, das bei der Suche nach Dateien durchsucht werden sollte, die zum App -Cast hinzugefügt werden können. Standardmäßig an . . Beispiel Verwendung: -b my/build/directory-r / --search-binary-subdirectories : Richtig, um das binäre Verzeichnis rekursiv nach Binärdateien zu durchsuchen; Falsch, um nur das obere Verzeichnis zu durchsuchen. Standardmäßig false . Beispiel Verwendung: -r .--single-file : Einzeldatei zum App-Cast hinzuzufügen-Wenn gesetzt, --binaries , --ext usw. werden alle ignoriert. Hilfreich zu verwenden, wenn Ihre Ausgabedatei keine Erweiterung hat (z. B. ist eine unixe ausführbare Datei). Beispiel Verwendung: --single-file path/to/my/file-f / --file-extract-version : Ob Sie die Version der Datei aus dem Namen der Datei und nicht der Datei (z. B. DLL) selbst extrahieren möchten oder nicht. Standardmäßig false . Verwenden Sie, wenn Ihre Dateien, die von NetSparkleUpdater heruntergeladen werden, die Versionsnummer im Dateinamen "My App 1.3.2-alpha1.exe" enthält. Beachten Sie, dass dies nur die letzten vier Verzeichniselemente/Ordner durchsucht. Beispiel Verwendung: -f true--file-version : Setzen Sie die Version für einen binären Binary in eine App-Besetzung. Beachten Sie, dass diese Version nur einmal festgelegt werden kann. Wenn Sie also eine App -Besetzung generieren, stellen Sie sicher, dass Sie entweder: a) nur einen Binärer in Ihrer App Cast | haben B) Verwenden Sie den Parameter --reparse-existing Parameter, damit alte Elemente abgeholt werden. Wenn der Generator 2 Binärdateien ohne bekannte Version findet und --file-version festgelegt ist, wird ein Fehler emittiert. Beispiel Verwendung: --file-version 1.3.2-o / --os : Betriebssystem, zu dem die App -Cast -Elemente gehören. Die String muss eines der folgenden enthalten: windows , mac , linux . Standardeinstellungen zu windows . Beispiel Verwendung: -o macos-arm64 ; -o windows-x64--description-tag : Text zum Einfügen der App Cast Description Tag/Informationen. Standardeinstellungen zu "neuesten Änderungen mit Links zu Updates". Beispiel Verwendung: --description-tag "Hello I am a Cool App"--link-tag : Text zum Einfügen des App-Cast- link Tags/-informationen. Sollte Ihre App -Cast -URL sein, wenn Sie dies verwenden. Beispiel Verwendung: --link-tag https://mysite.com/coolapp/appcast.xml-u / --base-url : Anfänger an der URL für Downloads. Der Dateiname, der heruntergeladen wird, wird nach diesem Teil der URL eingestellt. Beispiel Verwendung: -u https://myawesomecompany.com/downloads-l / --change-log-url : Der Anfänger der URL für Ihre Änderungsprotokolldateien zu verwenden. Die heruntergeladene Änderungsprotokolldatei wird nach diesem Teil der URL eingestellt. Wenn diese Option nicht angegeben ist, werden die Änderungsprotokolldaten in die App -Geting selbst eingereicht. Beispiel Verwendung: -l https://myawesomecompany.com/changes-p / --change-log-path : Pfad zu den Änderungsprotokolldateien für Ihre Software. Es wird erwartet, dass diese mit einer Erweiterung von .md im Markdown -Format liegen. Der Dateiname der Änderungsprotokolldateien muss die Version der Software enthalten, z. B. 1.3.2.md Beispiel Verwendung: -p path/to/change/logs . (Hinweis: Der Generator versucht auch, Änderungsprotokolle zu finden, deren Dateinamen wie SO formatiert sind: MyApp 1.3.2.md )--change-log-name-prefix : Präfix für die Änderung der Protokolldateinamen. Standardmäßig sucht der Generator nach Dateinamen mit dem Format "[Version] .md". Wenn Sie diesen Parameter auf (z. B.) "Mein App -Änderungs -Protokoll" festlegen, sucht er nach Dateinamen mit dem Format "My App ändern Protokoll [Version] .MD" sowie "[Version] .md".-n / --product-name : Produktname für Ihre Software. Wird verwendet, um den Titel für Ihre App -Besetzung und seine Artikel festzulegen. Standardeinstellung zur Application . Beispiel Verwendung: -n "My Awesome App"-x / --url-prefix-version : Fügen Sie die Versionsnummer als Präfix zum Dateinamen für die Download-URL hinzu. Standardmäßig falsch. Wenn beispielsweise --base-url www.example.com/downloads ist, ist Ihre Version 1.4.2 und Ihr App-Name ist MyApp.exe , Ihre Download-URL wird www.example.com/downloads/1.4.2/MyApp.exe . Beispiel Verwendung: -x true .--key-path : Pfad zu NetSparkle_Ed25519.priv und NetSparkle_Ed25519.pub -Dateien, die Ihre privaten und öffentlichen ED2519-Schlüssel für Ihre Software-Updates sind. Beispiel Verwendung: --key-path my/path/to/keysgenerate_appcast die Umgebungsvariablen SPARKLE_PRIVATE_KEY und SPARKLE_PUBLIC_KEY festlegen. Das Tool priorisiert Umgebungsschlüssel vor Schlüssel, die auf der Festplatte sitzen!--signature-file-extension : Erweiterung (ohne die . ) Für die App-Signaturdatei zu verwenden. Standardeinstellungen zur signature . Beispiel Verwendung: --signature-file-extension txt .--output-file-name : Ausgabedateiname für die App mit dem . oder die Erweiterung. Die Erweiterung wird dadurch gesteuert, ob es sich um eine XML- oder JSON -Ausgabe handelt und nicht konfigurierbar ist. Standardeinstellungen zu "Appcast". Natürlich können Sie dies immer später selbst ändern, nachdem die App -Besetzung generiert wurde. Diese Option dient nur aus Gründen der Bequemlichkeit. Beispiel Verwendung: --output-file-name super_app_download_info .--use-ed25519-signature-attribute : Wenn wahr und XML-Ausgabe ausgeführt werden, wird das Ausgangssignaturattribut in der XML eher edSignature als signature für die ursprüngliche Sparkle-Bibliothek entspricht. Keine Wirkung auf die JSON -App -Casts.--file-version : Setzen Sie die Version für einen binären Binary in eine App-Besetzung. Beachten Sie, dass diese Version nur einmal festgelegt werden kann. Wenn Sie also eine App -Besetzung generieren, stellen Sie sicher, dass Sie entweder: a) nur einen Binärer in Ihrer App Cast | haben B) Verwenden Sie den Parameter --reparse-existing Parameter, damit alte Elemente abgeholt werden. Wenn der Generator 2 Binärdateien ohne bekannte Version findet und --file-version festgelegt ist, wird ein Fehler emittiert.--critical-versions : Komma-getrennte Liste von Versionen, die in der App-Besetzung als kritisch markieren. Muss genau den Versionstext übereinstimmen. ZB "1.0.2,1.2.3.1".--reparse-existing : eine vorhandene App-Besetzung erneut anstatt sie zu überschreiben und neu zu erstellen. Überschneidet die Versionen bereits in der App-Besetzung. Wenn Sie also eine neue Binärdatei mit derselben Version bereitstellen, müssen Sie Ihre App-Cast manuell bearbeiten, um die alte Auflistung für die Version zu entfernen, die Sie neu abschließen. Beispiel Verwendung: --reparse-existing true--overwrite-old-items : Ursache App-Cast-Elemente, die in der App-Cast umgeschrieben werden, wenn die A-Binärdatei auf der Festplatte mit derselben Versionsnummer gefunden wird. Mit anderen Worten, wenn sich 1.0.1 bereits in der App -Besetzung befindet (entweder aus dem Reparieren oder aus einem anderen Binärer) und ein weiterer 1.0.1 auf der Festplatte gefunden wird, werden die 1,0.1 -Daten in der App -Besetzung basierend auf dem Binary gefunden. Beachten Sie, dass dies bedeutet, dass, wenn Sie mehrere 1.0.1 -Versionen auf der Festplatte haben (was Sie nicht tun sollten ...), der letzte gefundene in Ihrer App -Besetzung ist! Beispiel Verwendung: --overwrite-old-items--human-readable : Wenn wahr, macht die Ausgaber-App-Cast-Datei menschlich lesbar (NewsLines, Eingeweide). Beispiel Verwendung: --human-readable true--channel : Name des Release-Kanals für alle in die App-Besetzung hinzugefügten Elemente. Sollte ein einzelner Kanal sein; does not support multiple channels at once, eg beta,gamma . Do not set if you want to use your release channel - if you set this to release or stable , those names/words will be treated as special channels and not as the stable channel. (Unless you want all your items to be in a specific channel, of course.) Example use: --channel beta--output-type : Output type for the app cast file ( xml or json ). Defaults to xml . Example use: --output-type json --public-key-override : Public key override (ignores whatever is in the public key file) for signing binaries. This overrides ALL other public keys set when verifying binaries, INCLUDING public key set via environment variables! If not set, uses --key-path (if set) or the default SignatureManager location. Not used in --generate-keys or --export . Example use: --public-key-override asoj341ljsdflj--private-key-override : Private key override (ignores whatever is in the private key file) for signing binaries. This overrides ALL other public keys set when verifying binaries, INCLUDING private key set via environment variables! If not set, uses --key-path (if set) or the default SignatureManager location. Not used in --generate-keys or --export . Example use: --private-key-override asoj341ljsdflj --generate-keys : If set, will attempt to generate NEW Ed25519 keys for you. Can be used in conjunction with --key-path . Once keys are successfully (or unsuccessfully) generated, the program ends without generating an app cast. By default, existing keys are not overwritten. This option defaults to false .--force : If set to true , will overwrite existing keys on disk. WARNING: THIS COULD RESULT IN A LOSS OF YOUR PUBLIC AND PRIVATE KEYS. USE WITH CAUTION. DO NOT USE IF YOU DO NOT KNOW WHAT YOU ARE DOING! THIS WILL MAKE NO ATTEMPT TO BACK UP YOUR DATA. This option defaults to false . Example use: --generate-keys --force true .--export : Export keys as base 64 strings to the console. Defaults to false . Example use: --export true . Output format: Private Key:
2o34usledjfs0
Public Key:
sdljflase;ru2u3
--generate-signature : Generate a signature for a file and output it to the console. Example use: --generate-signature path/to/app/MyApp.exe . Outputs in format: Signature: seljr13412zpdfj . Note that these options are only for verifying Ed25519 signatures. For DSA signatures, please use the DSAHelper tool. Both of the following options must be used together. You must have keys already generated in order to verify file signatures.
--verify : Path to the file that has a signature you want to verify.--signature : Base 64 signature of the file. Example use: --verify my/path/MyApp.exe --signature 123l4ijsdfzderu23 .
This will return either Signature valid (signature is good!) or Signature invalid (signature does not match file).
# ### Key Generation
# Generate Ed25519 keys for the first time
netsparkle-generate-appcast --generate-keys
# Store keys in a custom location
netsparkle-generate-appcast --key-path path/to/store/keys
# Pass in public key via command line
netsparkle-generate-appcast --public-key-override [YourPublicKeyHere]
# Pass in private key via command line
netsparkle-generate-appcast --private-key-override [YourPrivateKeyHere]
# By default, your Ed25519 signatures are stored on disk in your local
# application data folder in a subdirectory called `netsparkle`.
# If you want to export your keys to the console, you can do:
netsparkle-generate-appcast --export
# You can also store your keys in the following environment variables:
# set public key: SPARKLE_PUBLIC_KEY
# set private key: SPARKLE_PRIVATE_KEY
# ### Generate a signature for a binary without creating an app cast:
netsparkle-generate-appcast --generate-signature path/to/binary.exe
# ### Verifying Binaries
netsparkle-generate-appcast --verify path/to/binary.exe --signature base_64_signature
# ### Using a custom key location:
# If your keys are sitting on disk somewhere
# (`NetSparkle_Ed25519.priv` and `NetSparkle_Ed25519.pub` -- both
# in base 64 and both on disk in the same folder!), you can pass in
# the path to these keys like this:
netsparkle-generate-appcast --key-path path/to/keys/
# ### Generating an app cast
# Generate an app cast for Windows executables that are sitting in a
# specific directory
netsparkle-generate-appcast -a directory/for/appcast/output/ -e exe -b directory/with/binaries/ -o windows
# Add change log info to your app cast
netsparkle-generate-appcast -b binary/folder -p change/log/folder
# Customize download URL for binaries and change logs
netsparkle-generate-appcast -b binary/folder -p change/log/folder -u https://example.com/downloads -l https://example.com/downloads/changelogs
# Set your application name for the app cast
netsparkle-generate-appcast -n " My Awesome App " -b binary/folder
# Use file versions in file names, e.g. for apps like "My App 1.2.1.dmg"
netsparkle-generate-appcast -n " macOS version " -o macos -f true -b binary_folder -e dmg
# Don't overwrite the entire app cast file
netsparkle-generate-appcast --reparse-existing
# Don't overwrite the entire app cast file, but do overwrite items that are still on disk
netsparkle-generate-appcast --reparse-existing --overwrite-old-itemsPlease see the UPGRADING.md file for information on breaking changes and fixes between major versions.
Nein. You can just reference the core library and handle everything yourself, including any custom UI. Check out the code samples for an example of doing that!
This isn't a built-in feature, as NetSparkleUpdater assumes that it can safely make calls/events to the UI on the thread that started the SparkleUpdater instance. However, if you'd like to do this, we have a sample on how to do this: NetSparkle.Samples.Forms.Multithread . Basically, instead of passing in a UIFactory to SparkleUpdater , you handle SparkleUpdater 's events yourself and show the UI however you want to show it - and yes, you can still use the built-in UI objects for this!
(Note that on Avalonia, the answer is always "No" since they only support one UI thread at this time.)
Ja. You need to start the NetSparkleUpdater forms on a new thread(s). See the NetSparkle.Samples.Forms.Multithread sample for how to do this by handling events yourself and still using the built-in WinForms UIFactory .
See #238 and this documentation for the fix for making this work on the sample application. Basically, you need to use an app config file and manifest file to let Windows know that your application is DPI-aware. If that doesn't work for you, try some of the tips at this SO post.
Ja!
--os command line parameter.macos-arm64 or windows-x64 rather than just macos or windows Trimming is a great way to reduce the file size of your application when it is self-published and/or built as a self-contained application. In short, trimming removes unused code from your applications, including external libraries, so you can ship your application with a reduced file size. To trim your application on publish, add <PublishTrimmed>true</PublishTrimmed> to your csproj file. If you want to trim all assemblies (including those that may not have specified they are compatible with trimming), add <TrimMode>full</TrimMode> to your csproj file; to only trim those that have opted-in, use <TrimMode>partial</TrimMode> . To enable warnings for trimming, add <SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings> .
There are other options to use, which you can learn more about on Microsoft's documentation here. For those applications that may not work with the built-in trimming options, please try Zack.DotNetTrimmer or other solutions you may find.
We recommend that you trim your application before publishing it and distributing it to your users. Some of NetSparkle's default dependencies are rather large, but the file size can be drastically reduced by the trim process. If you choose to trim your application, don't forget to test it after trimming and make sure you fix any warnings that come up!
You can also read more about trimming libraries here.
Ja.
Ja.
Ja. In the app cast generator, you can do things like, -u ../ to make NetSparkle check the directory above the server's appcast.xml file for download files.
NetSparkleUpdater.SparkleUpdater is the right package if you want the library with no built-in UI. Otherwise, use NetSparkleUpdater.UI.{YourChoiceOfUI} , which will give you a built-in UI and the core library. Previous to 2.0, the UI libraries reference NetSparkle.New , which is now deprecated.
Here is the full list of deprecated packages:
com.pikleproductions.netsparkle -- replaced by NetSparkleUpdater.SparkleUpdatercom.pikleproductions.netsparkle.tools -- replaced by NetSparkleUpdater.Tools.AppCastGenerator and NetSparkleUpdater.Tools.DSAHelperNetSparkle.New -- replaced by NetSparkleUpdater.SparkleUpdaterNetSparkle.New.Tools -- replaced by NetSparkleUpdater.Tools.AppCastGenerator and NetSparkleUpdater.Tools.DSAHelperNetSparkleUpdater.Tools -- replaced by NetSparkleUpdater.Tools.AppCastGenerator and NetSparkleUpdater.Tools.DSAHelperNo. If your app is just using NetSparkle to work out if there is a later release - and you are not using the app cast as a way to refer to historical versions of your app in any way - then you don't need to add all the released versions into the app cast file.
Having just the latest version of your software in the app cast has the added side effect that you won't need all the binaries & changelogs of all the versions to be available to the app cast generator tool. For example, this might make an automated release build easier via GitHub Actions - because the only data required is the generated .exe and changelogs from your git repository.
SecurityMode.Unsafe or the following IAppCastHandler override: public override bool DownloadAndParse ( )
{
try
{
_logWriter . PrintMessage ( "Downloading app cast data..." ) ;
var appCast = _dataDownloader . DownloadAndGetAppCastData ( _castUrl ) ;
if ( ! string . IsNullOrWhiteSpace ( appCast ) )
{
Items . Clear ( ) ;
Items . AddRange ( ParseAppCast ( appcast ) ) ;
return true ;
}
}
catch ( Exception e )
{
_logWriter . PrintMessage ( "Error reading app cast {0}: {1} " , _castUrl , e . Message ) ;
}
return false ;
}The answer is both yes and no. No, because that is not the default behavior. Yes, because if you use installers for each of your versions, you can use your app cast to see which previous versions are available and download those versions. If your installers are standalone, they should install an old version just fine. Just keep in mind that if you install an old version and then there is a newer version in your app cast, after opening the older software, it will ask them if they want to update to the newer version!
Here's a summary of what you can do:
SparkleUpdater object_updateInfo = await _sparkle.CheckForUpdatesQuietly(); (no UI shown) or _sparkle.CheckForUpdatesAtUserRequest() (shows UI). I would recommend checking quietly because the UI method will always show the latest version. You can always show your own UI._updateInfo.Updates for the available versions in your app cast. You can compare it with your currently installed version to see which ones are new and which ones are old.await _sparkle.InitAndBeginDownload(update); with the update you want to download. The download path is provided in the DownloadFinished event._sparkle.InstallUpdate(update, _downloadPath);The Handle Events Yourself sample and the Rollback sample will be very helpful to you in learning how to do these sort of things.
Ja. Implement IAppCastGenerator and set the SparkleUpdater.AppCastGenerator property to an instance of your class. You will have to implement the following methods:
AppCast DeserializeAppCast ( string appCastString ) ;
Task < AppCast > DeserializeAppCastAsync ( string appCastString ) ;
AppCast DeserializeAppCastFromFile ( string filePath ) ;
Task < AppCast > DeserializeAppCastFromFileAsync ( string filePath ) ;
string SerializeAppCast ( AppCast appCast ) ;
Task < string > SerializeAppCastAsync ( AppCast appCast ) ;
void SerializeAppCastToFile ( AppCast appCast , string outputPath ) ;
Task SerializeAppCastToFileAsync ( AppCast appCast , string outputPath ) ; As you can see, many of those functions are small variants of the core serialization and deserialization processes that you want to accomplish. You can look at the implementation of JsonAppCastGenerator and XMLAppCastGenerator for implementation examples.
Ja. Implement IAppCastGenerator and set the SparkleUpdater.AppCastGenerator property to an instance of your class. You'll have to make the actual app cast file yourself, though, since the app cast generator is only currently compatible with XML and JSON.
Right now, we are compatible with version 11. If you need to make changes, you can use your own IUIFactory implementation to fix any issues that come up.
DSA signatures are not recommended when using NetSparkleUpdater 2.0+. They are considered insecure!
You can still generate/use these signatures, however, using the DSAHelper tool (from this NuGet package or in the source code here). Key generation only works on Windows because .NET Core 3 does not have the proper implementation to generate DSA keys on macOS/Linux; however, you can get DSA signatures for a file on any platform. If you need to generate a DSA public/private key, please use the DSAHelper tool on Windows like this:
netsparkle-dsa /genkey_pair
You can use the DSAHelper to get a signature like this:
netsparkle-dsa /sign_update {YourInstallerPackage.msi} {NetSparkle_PrivateKey_DSA.priv}
dotnet tool install --global NetSparkleUpdater.Tools.DSAHelpernetsparkle-dsa command Pass a DSAChecker into your SparkleUpdater constructor rather than an Ed25519Checker .
If your app has DSA signatures, the app cast generator uses Ed25519 signatures by default starting with preview 2.0.0-20200607001 . To transition to Ed25519 signatures, create an update where the software has your new Ed25519 public key and a NEW url for a NEW app cast that uses Ed25519 signatures. Upload this update with an app cast that has DSA signatures so your old DSA-enabled/containing app can download the Ed25519-enabled update. Then, future updates and app casts should all use Ed25519.
Here are some things you can do to figure out how to get your app running:
SparkleUpdater.LogWriter = new LogWriter(LogWriterOutputMode.Console) and then watch your console output while debugging.Ja! Please help us make this library awesome!
NetSparkle is available under the MIT License.
Contributions are ALWAYS welcome! If you see a new feature you'd like to add, please open an issue to talk about it first, then open a PR for that implementation. If there's a bug you find, please open a PR with the fix or file an issue! Danke schön!! :) You can also join us in our Gitter chat room!
An incomplete list of other projects related to software updating that you might want to look at if NetSparkleUpdater doesn't work for you: