- Updated .NET and .NET Framework compatibility (Bump minimum requirement to .NET 4.6.2, Add .NET 9)
- Built-in JSON app cast reading/writing instead of just XML
- Built-in ability to use different channels for your apps (e.g. beta, alpha, preview)
- Semver compatibility
- Reworked app cast serializing/deserializing API
- New assembly accessor
- Trimming/AOT compatibility
- Nullability annotations
- Smaller file size due to fewer dependencies
- Simplified threading model
- Simplified custom UI interface/usage
- More samples for end users
- Updated README and documentation
- A bunch of bug fixes and adjustments everywhere
- The built-in Avalonia UI now runs on version 11 of Avalonia (6a9a6426324e357daf0f9991d7a981b19a009b93, a0a7314317e9fc712270f75f31c6442a2d454da3, 46de3e9c9525cac4026a7959e44764752cdf36ee,
avalonia-preview
branch) - Bumped minimum version of .NET Framework from 4.5.2 to 4.6.2 (57fa9ad2597ec6615894464b8f2ccef881dda52b) as 4.5.2 is EOL per https://learn.microsoft.com/en-us/lifecycle/products/microsoft-net-framework
- Removed
Newtonsoft.Json
dependency for .NET Framework build and useSystem.Text.Json
(57fa9ad2597ec6615894464b8f2ccef881dda52b) System.Text.Json
is only explicitly included fornetstandard2.0
andnet462
as otherwise the framework already includes it (#601)- .NET Framework
ReleaseNotesGrabber
uses anHttpClient
instead of aWebClient
for downloading (31523e95b50f00fab3fb3e043dea7d32227d5862) WebClientFileDownloader
renamed toWebFileDownloader
to better reflect functionality (e85235f512f4344c9a675e56e9a4d50434c33959)- Changed
net6
tonet6.0
to be consistent with newer versions - Removed
netcoreapp3.1
andnet5.0
compatibility as they are both EOL per https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core (87381f2d3422e36fe5f614c85e43687eed497c42) - Moved to official/non-preview builds of
System.Drawing.Common
for 8.x and bump up to8.0.0
for older versions of .NET (87381f2d3422e36fe5f614c85e43687eed497c42) [**] - Use
.axaml
in all Avalonia-related projects (46de3e9c9525cac4026a7959e44764752cdf36ee, e6d5ad20fec37e018a23ab46ef34d728b8104e96) Exec(string cmd, bool waitForExit = true)
now returns abool
:true
for the process starting,false
otherwise- The
IAppCastFilter
API has changed to:IEnumerable<AppCastItem> GetFilteredAppCastItems(SemVerLike installed, IEnumerable<AppCastItem> items)
IAppCastFilter
now expects you to filter out old versions and do sorting yourself as needed (previously filtering out old versions yourself could be avoided via abool
property onFilterResult
; to do this easily yourself now, use theAppCastReducers.RemoveOlderVersions
reducer like so:AppCastReducers.RemoveOlderVersions(installed, itemsToFilter)
)- The
FilterResult
class has been removed in its entirety (882ee260dd24245c53d351d4151b8b4bd4a53588) - Used
SemVerLike
everywhere instead ofSystem.Version
for semver compatibility WebFileDownloader
now deletes files on cancellation of a download likeLocalFileDownloader
did already (1cd2284c41bbe85d41566915965ad2acdb1a61f5)WebFileDownloader
does not callPrepareToDownloadFile()
in its constructor anymore. Now, it is called after the object is fully created. (420f961dfa9c9071332e2e0737b0f287d2cfa5dc)- NOTE: If you update to .NET 8+ in your own app, the location of
JSONConfiguration
save data, by default, will CHANGE due to a change in .NET 8 forEnvironment.SpecialFolder.ApplicationData
. See: https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/8.0/getfolderpath-unix. This may cause user's "skipped version" or other data to be lost unless you migrate this data yourself. For most users who are using the defaults, this is likely only a minor (if any) inconvenience at all, but it is worth noting. SparkleUpdater makes no attempt to account for this change at this time. AssemblyReflectionAccessor
has been deprecated. Please useAssemblyDiagnosticsAccessor
instead. (#587)AssemblyDiagnosticAccessor.AssemblyVersion
now returnsFileVersionInfo.GetVersionInfo(assemblyName).ProductVersion
rather thanFileVersionInfo.GetVersionInfo(assemblyName).FileVersion
so we can get semver versioning information- For ed25519 use, changed from
BouncyCastle
to a custom fork ofChaos.NaCl
(large file size savings and we don't need all of BouncyCastle's features). You can verify its use and code online here: https://github.com/NetSparkleUpdater/Chaos.NaCl. Additionally, this package is available on NuGet for your own projects under the package nameNetSparkleUpdater.Chaos.NaCl
. LogWriter
has undergone several changes:public static string tag = "netsparkle:";
has changed topublic string Tag { get; set; } = "netsparkle:";
- Instead of a simple
bool
to control printing toTrace.WriteLine
orConsole.WriteLine
, there is now a new enum,NetSparkleUpdater.Enums.LogWriterOutputMode
, which you can use to control whetherLogWriter
outputs toConsole
,Trace
,Debug
, or toNone
(don't output at all). - Removed
PrintDiagnosticToConsole
property and replaced it withOutputMode
of typeLogWriterOutputMode
. - The default print mode for
LogWriter
is stillTrace
by default, as it was in prior versions. - By default, timestamps are now output along with the
Tag
and actual log item
RegistryConfiguration
has changed its default final path toNetSparkleUpdater
instead ofAutoUpdate
. Please migrate saved configuration data yourself if you need to do so for your users (probably not necessary).ShowUpdateNeededUI
no longer shows an update window if the number of update items is 0. (Arguably a bug fix, but technically a breaking change.)- Major refactoring for app cast handling/parsing to clean up logic / make new formats easier
- New
AppCast
model class that holds info on the actual app cast and its items AppCastItem
no longer contains information on serializing or parsing to/from XML- App cast parsing/serializing is now handled by an
IAppCastGenerator
implementationXMLAppCast
renamed toAppCastHelper
SparkleUpdater
now has anAppCastGenerator
member that handles deserializing the app cast rather thanAppCastHelper
AppCastItem
serialization now expects the full download link to already be known (serialization will not consider the overall app cast URL)
IAppCastHandler
is no longer available/used.- App cast downloading and item filtering is now handled by
AppCastHelper
. - If you want to manage downloads, implement
IAppCastDataDownloader
and setSparkleUpdater.AppCastDataDownloader
- If you want to manage deserializing/serializing the app cast, implement
IAppCastGenerator
and setSparkleUpdater.AppCastGenerator
- If you want to manage filtering on your own, implement
IAppCastFilter
and setSparkleUpdater.AppCastHelper.AppCastFilter
AppCastHelper
also has two new properties:FilterOutItemsWithNoVersion
andFilterOutItemsWithNoDownloadLink
, which both default totrue
.
- If you need absolute control more than the above, you can subclass
AppCastHelper
and override methods:SetupAppCastHelper
,DownloadAppCast
, andFilterUpdates
. This probably is not necessary, however, and you can do what you want through the interfaces, most likely.
- App cast downloading and item filtering is now handled by
AppCastHelper.SetupAppCastHelper
signature is nowSetupAppCastHelper(IAppCastDataDownloader dataDownloader, string castUrl, string? installedVersion, ISignatureVerifier? signatureVerifier, ILogger? logWriter = null)
(note: no longer takes aConfiguration
object)
- New
- Renamed
AppCastItem.OperatingSystemString
toOperatingSystem
- XML app casts write
version
,shortVersion
, andcriticalUpdate
to the<item>
tag and the<enclosure>
(both for backwards/Sparkle compat; we'd rather not write to<enclosure>
but we don't want to break anyone that updates their app cast gen without updating the main library, so that may change again in the far future).- If both the overall
<item>
and the<enclosure>
have this data, the info from the<item>
is prioritized. - JSON app casts are not affected.
- If both the overall
IUpdateDownloader
has a new eventDownloadStarted
of typeDownloadFromPathToPathEvent(object sender, string from, string to)
, which should be called right before any download begins.IUpdateDownloader.StartFileDownload
returnsTask
IUpdateDownloader.StartFileDownload
renamed toIUpdateDownloader.DownloadFile
- Background worker loop pauses for a few seconds before starting just in case the loop started with the software -- so the update available window isn't immediately shown to the user (if applicable)
ReleaseNotesGrabber.GetReleaseNotes
andDownloadAllReleaseNotes
no longer take aSparkleUpdater
instance since that is given in the constructorReleaseNotesGrabber
constructor now takes aISignatureVerifier
rather than aSparkleUpdater
instanceReleaseNotesGrabber
uses theAppCastItem.Title
property now, which by default includes version when creating via the app cast generator, for display of a release's title instead of just theVersion
property- Major UI usage refactoring:
ShowsUIOnMainThread
is gone and will not come back. It never really worked as intended and was just confusing. If you want to do fancy things with threads, handleSparkleUpdater
events and handle things in your own way for your own app's needs.- It's highly recommended to start NetSparkle on the main thread.
- The background loop will use
SyncronizationContext
to post events and callbacks to whatever thread/context started the mainSparkleUpdater
instance, which is why starting things on the main UI thread is recommended. - You can still do your own things with threads by handling events instead of passing a built-in
UIFactory
toSparkleUpdater
, but this does not stop you from using a built-inUIFactory
implementation to actually create said GUI elements. See theNetSparkle.Samples.Forms.Multithread
sample. - For a sample of running WinForms on multiple UI threads while still using built-in UI objects, see the
NetSparkle.Samples.Forms.Multithread
sample. - Note: passing your own
UIFactory
that starts windows/things on new threads intoSparkleUpdater
is not a supported configuration. It might work, it might not. Use at your own risk.
- The background loop will use
- NetSparkle basically makes no attempts to worry about threading now (e.g. calling to the main thread) except for the background loop calling to the main thread that started the
SparkleUpdater
instance. For most apps, this will be fine as they are just using their main UI thread. - Practically speaking, though, if you call
SparkleUpdater
functions on a background thread, subsequent events and things that are called as a result of thatSparkleUpdater
call will probably come back on the background thread that first called the event. Use at your own risk. When in doubt, for your own UI needs, make sure to checkInvokeRequired
on WinForms, and on WPF/Avalonia, marshal things to the UI thread (unless you're using data binding in which case it's handled for you!). UIFactory
changes:- No more
Init
method. Use your constructor and/or your own methods if you need this. - Most method signatures have changed and have moved in the direction of only taking what is actually needed. Notably, no methods take a
SparkleUpdater
instance, now. - Basically, if you were using your own
IUIFactory
implementation, you probably need to take a look at the new interface and/or the samples to see how things are done now. Things are simpler, now, in the long run.
- No more
- Release notes window now uses
AppCastItem.Title
for each item's title instead of just theVersion
-
Lines ending in [**] are candidates for backporting to 2.x if time/desired by users.
-
Lines ending in [**!] have been backported.
-
Don't get download name if no need to (e63ebb054d62e26232b808189eb4619566952f3a) [**]
-
Fixed some documentation in
LocalFileDownloader
(6ca714ca62577bc7412353338a148a03810ba81a) [**] -
Use net8.0 in Avalonia samples (46de3e9c9525cac4026a7959e44764752cdf36ee)
-
Remove obsolete NetSparkleException override (3f54a53c7839fb99b291f8bc15b751aceb2d28de)
-
Fixed
IsCriticalUpdate
not being written to the app cast (2142e8e0c277523ac33b2ba1d19d0e1fd9ca8483) [**!] -
Added more compatibility with Sparkle feeds (c9e2ddb4eea291c7f12e7747d9822aaa7fdb8c29) - see #275 [**]
-
Added
InstallerProcess
public var for easier access of the installer process in case you are making an app that updates other apps (5e6c321846d08645e0fc891a33f1461780c4b405) [**] -
Allow user to avoid killing the parent process that started the update process --
ShouldKillParentProcessWhenStartingInstaller
; defaults totrue
(19fae1ab1766eafea5a07881ac2598b4355f69f6) [**] -
Allow setting the process ID to kill when starting the installer --
ProcessIDToKillBeforeInstallerRuns
; defaults tonull
(8cc81e0a561b82c220ecd3a86c5f424a236dc268) [**] -
Fixed Cancel button not working in Avalonia checking for updates window (f35e8968c1c7167664f90f91835ea3019acd2046) [**]
-
Added
InstallerProcessAboutToStart
event. You can use this to modify/see the installer process before it actually begins and optionally makeNetSparkleUpdater
not run the process (you'll have to run the process yourself in that case). (a5cbbf1abce83de209f9d62a8fe2434f6b5cc85a) -
Added
SemVerLike
class that combines the normal .NETSystem.Version
with semver properties (@kenjiuno) -
Added
VersionTrimmers
for trimmingSemVerLike
versions toSystem.Version
(@kenjiuno) -
Added
AppCastReducers
helpers for common ways of filtering app cast items (@kenjiuno) -
Added
SparkleUpdater.InstallUpdateFailed
to see whyInstallUpdate
or its related installer methods fail. Also addsEnums.InstallUpdateFailureReason
. (fe546de8667b1a5d6e0c4a72a7c128dc954f4aba) -
WebFileDownloader.PrepareToDownloadFile
is nowvirtual
(84df81122cfae9309de4f5b79489e46287bf3a62) -
The app cast maker now expects at least
Major.Minor
for version numbers and no longer accepts single digits as version numbers (this fixes things like "My Super App Version 2.exe" having 2 being detected as the version number when the version number is in a prior folder name, and also ensures that the right number is being read). Note that if you want to use semantic versions with file name version detection, you need to useMajor.Minor.Revision
.1.0-beta1
will not be parsed as a semantic version and will in fact not be detected as having a version at all. -
If
JSONConfiguration
cannot save data,SparkleUpdater
now uses theDefaultConfiguration
class, which basically has no information set on it and will always check for updates for the user. (a33266ac99b3eed83ff481ee7ef06cc5a0b1ab40) -
Fixed Avalonia message window close button not working properly (394841d47c8b6739ca0ebcec87303529b81da904)
-
Fixed
AssemblyReflectionEditor
not loading in a way that allowed for proper file closing of the DLL (fixes a unit testing issue) -
Avalonia UI now uses
CompiledBinding
-
Fixed
JSONConfiguration
not using correct default last config/check update time -
Added
nullability
compatibility to core and UI libraries (#595)- Base language version is now 8.0 (9.0 for Avalonia), but this is only used for nullability compatibility (compile-time), so this shouldn't affect older projects (
.NET 4.6.2
,netstandard2.0
) and is thus a non-breaking change
- Base language version is now 8.0 (9.0 for Avalonia), but this is only used for nullability compatibility (compile-time), so this shouldn't affect older projects (
-
Fixed initialization issue in DownloadProgressWindow (WinForms) icon use
-
Added
JsonAppCastGenerator
to read/write app casts from/to JSON (output json with the app cast generator option--output-type json
and then set theAppCastGenerator
on yourSparkleUpdater
object to an instance ofJsonAppCastGenerator
) -
Added
ChannelAppCastFilter
(implementsIAppCastFilter
) for easy way to filter your app cast items by a channel, e.g.beta
oralpha
. Use by settingAppCastHelper.AppCastFilter
. Uses simplestring.Contains
invariant lowercase string check to search for channels in theAppCastItem
's version and/orChannel
information.- If you want to allow versions like
2.0.0-beta.1
or channels such asbeta
, setChannelSearchNames
tonew List<string>() {"beta"}
- Set
RemoveOlderItems
tofalse
if you want to keep old versions when filtering, e.g. for rolling back to an old version - Set
KeepItemsWithNoChannelInfo
tofalse
if you want to remove all items that don't match the given channel (doing this will not let people on a beta version update to a non-beta version!)
- If you want to allow versions like
-
AppCast? SparkleUpdater.AppCastCache
holds the most recently deserialized app cast information. -
AppCastItem
has a newChannel
property. Use it along withChannelAppCastFilter
if you want to use channels that way instead of via your csproj<Version>
property. In the app cast generator, use the--channel
option to set this (note that using this will set ALL items added to the app cast to that specific channel; to add only new items to your app cast instead of rewriting the whole thing, use the--reparse-existing
option). -
App cast generator has a new
--use-ed25519-signature-attribute
to useedSignature
in its XML output instead ofsignature
(json output unaffected) to match the original Sparkle library -
Added
UpdateDetectedAsync
-- prioritized overUpdateDetected
if bothUpdateDetectedAsync
andUpdateDetected
are implemented. -
Fixed calling
CheckForUpdatesAtUserRequest
not showing UI ifUpdateDetected
/UpdateDetectedAsync
is implemented and the next action is to show the user interface -
ReleaseNotesGrabber.DownloadReleaseNotes
catches all exceptions instead of justWebException
-
WinForms projects are now in the same project/run the same overall code.
-
NetSparkle.UI.WinForms.NetFramework
now includesSystem.Resources.Extensions
-
Fixed WPF and Avalonia download progress windows not turning red on signature validation failure
-
AppCastItem
operating system checks now use.Contains
rather than==
, allowing for OS strings likemacOS-arm64
rather than justmacOS
-
Add
TrustEverySSLConnection
to .NET CoreWebFileDownloader
-
Fix
WebFileDownloader
not setting up anHttpClientHandler
(was always auto-redirect'ing before despite settingRedirectHandler
; now behaves more similarly toWebRequestAppCastDataDownloader
) -
Fixed
Unsafe
mode in DSA/ed25519 checkers still checking signatures if a signature existed -
Deprecated
SecurityProtocolType SecurityProtocolType
property inSparkleUpdater
(deprecated in .NET 9 and you can easily override the pertinentHttpClient
behavior yourself) -
SparkleUpdater.GetDownloadPathForAppCastItem
is now markedvirtual
-
Added
TmpDownloadFileNameWithExtension
for controlling the download file name (useTmpDownloadFilePath
to control the download file path) -
WebFileDownloader.RetrieveDestinationFileNameAsync
is now markedvirtual
- .NET Framework and .NET compatibility adjustments
- Huge amount/level of configurability compared to prior versions
- Custom UIs are now possible through the
IUIFactory
interface - You can have custom app cast downloaders and handlers (e.g. for FTP download or JSON app casts)
- Change of base namespace
- Built-in, ready-to-go UIs for WPF, WinForms, and Avalonia
- New NuGet packaging scheme
- Ed25519 compatibility
This section holds info on major changes when moving from versions 0.X or 1.Y. If we've forgotten something important, please file an issue.
- Minimum .NET Framework requirement, if running on .NET Framework, is now .NET Framework 4.5.2 instead of 4.5.1. Otherwise, the core library is .NET Standard 2.0 compatible, which means you can use it in your .NET Core and .NET 5+ projects.
- Change of base namespace from
NetSparkle
toNetSparkleUpdater
Sparkle
renamed toSparkleUpdater
for clarity- More logs are now written via
LogWriter
to help you debug and figure out any issues that are going on - The default
NetSparkleUpdater
package (NetSparkleUpdater.SparkleUpdater
) has no built-in UI. Please use one of the NetSparkleUpdater packages with a UI if you want a built-in UI that is provided for you.- Note that if you do not use a
UIFactory
, you must use theCloseApplication
orCloseApplicationAsync
events to close your application; otherwise, your downloaded update file will never be executed/read! The only exception to this is if you want to handle all aspects of installing the update package yourself.
- Note that if you do not use a
- XML docs are now properly shipped with the code for all public and protected methods rather than being here in this README file
- Enabled build time warnings for functions that need documentation that don't have it
SparkleUpdater
constructors now require anISignatureVerifier
in order to "force" you to choose your signature verification methodSecurityMode
is a new enum that defines which signatures are required and which signatures are not required- Added
SecurityMode.OnlyVerifySoftwareDownloads
if you want to verify only software download signatures and don't care about verifying your app cast or release notes
- Added
- UIs are now in different namespaces. If you want to use a UI, you must pass in a
UIFactory
that implementsIUIFactory
and handles showing/handling all user interface elementsNetSparkleUpdater
offers basic, built-in UIs for WinForms, WPF, and Avalonia. Copy & paste these files to your project and modify them to make them work better in your project!SparkleUpdater
no longer holds its ownIcon
. This is now handled by theUIFactory
object.HideReleaseNotes
,HideRemindMeLaterButton
, andHideSkipButton
are all handled by theUIFactory
objects
- Added built-in UIs for WPF and Avalonia 0.10.X.
- Localization capabilities are now non-functional and are expected to come back in a later version. See this issue. (Contributions are welcome!)
- Most
SparkleUpdater
elements are now configurable. For example, you can implementIAppCastHandler
to implement your own app cast parsing and checking.IAppCastDataDownloader
to implement downloading of your app cast fileIUpdateDownloader
to implement downloading of your actual binary/installer as well as getting file names from the server (ifCheckServerFileName
istrue
)IAppCastHandler
to implement your own app cast parsingISignatureVerifier
to implement your own download/app cast signature checking. NetSparkleUpdater has built-in DSA and Ed25519 signature verifiers.IUIFactory
to implement your own UIIUIFactory
implementors must now haveReleaseNotesHTMLTemplate
andAdditionalReleaseNotesHeaderHTML
-- it's ok if these arestring.Empty
/""
/null
.IUIFactory
methods all now take a reference to theSparkleUpdater
instance that called the method
ILogger
to implement your own logger class (rather than being forced to subclassLogWriter
like in previous versions)Configuration
subclasses now take anIAssemblyAccessor
in their constructor(s) in order to define where assembly information is loaded from- Many
SparkleUpdater
functions are now virtual and thus more easily overridden for your specific use case - Several
ReleaseNotesGrabber
functions are now virtual as well.
- Many delegates, events, and functions have been renamed, removed, and/or tweaked for clarity and better use
DownloadEvent
now has theAppCastItem
that is being downloaded rather than being just the download pathAboutToExitForInstallerRun
/AboutToExitForInstallerRunAsync
has been renamed toPreparingToExit
/PreparingToExitAsync
, respectively- The
UserSkippedVersion
event has been removed. UseUserRespondedToUpdate
instead. - The
RemindMeLaterSelected
event has been removed. UseUserRespondedToUpdate
instead. - The
FinishedDownloading
/DownloadedFileReady
events have been removed. UseDownloadFinished
instead. - The
StartedDownloading
event has been removed and replaced withDownloadStarted
- The
DownloadError
event has been removed and replaced withDownloadHadError
Sparkle.RunUpdate
no longer exists. UseSparkleUpdater.InstallUpdate
instead.Sparkle.DownloadPathForAppCastItem
->SparkleUpdater.GetDownloadPathForAppCastItem
AppCastItem.DownloadDSASignature
->AppCastItem.DownloadSignature
SilentModeTypes
enum renamed toUserInteractionMode
Sparkle.SilentMode
renamed toSparkle.UserInteractionMode
UseSyncronizedForms
renamed toShowsUIOnMainThread
- Samples have been updated and improved
- Sample apps for Avalonia, WinForms, and WPF UIs
- Sample app to demonstrate how to handle events yourself with your own, custom UI
- By default, the app cast signature file now has a
.signature
extension. The app cast downloader will look for a file with the old.dsa
signature if data is not available or found in aappcast.xml.signature
on your server. You can change the extension using thesignature-file-extension
option in the app cast generator and via theXMLAppCast.SignatureFileExtension
property. sparkle:dsaSignature
is nowsparkle:signature
instead. If nosparkle:signature
is found,sparkle:dsaSignature
will be used (if available). Ifsparkle:dsaSignature
is not found,sparkle:edSignature
will be used (if available). This is to give us as much compatibility with old versions ofNetSparkle
as well as the macOSSparkle
library.- An entirely new app cast generator tool is now available for use.
- By default, the app cast generator tool now uses Ed25519 signatures. If you don't want to use files on disk to store your keys, set the
SPARKLE_PRIVATE_KEY
andSPARKLE_PUBLIC_KEY
environment variables before running the app cast generator tool. You can also store these signatures in a custom location with the--key-path
flag.- You can still use DSA signatures via the DSAHelper tool and the
DSAChecker
class. This is not recommended. Ed25519Checker
is the class responsible for handling Ed25519 signatures.DSAChecker
sticks around for verifying DSA signatures if they're still used.
- You can still use DSA signatures via the DSAHelper tool and the
- Removed
AssemblyAccessor
class in lieu ofIAssemblyAccessor
implementors - The server file name for each app cast download is now checked before doing any downloads or showing available updates to the client. To disable this behavior and use the name in the app cast, set
SparkleUpdater.CheckServerFileName
tofalse
. bool ignoreSkippedVersions = false
has been added toCheckForUpdatesAtUserRequest
,CheckForUpdatesQuietly
, andGetUpdateStatus
to make ignoring skipped versions easier.- The file name/path used by
RelaunchAfterUpdate
are controlled byRestartExecutableName
andRestartExecutablePath
, respectively.SparkleUpdater
makes a best effort to figure these out for you; however, you can override them if you need to. NOTE: The way these parameters are fetched has CHANGED in recent previews (as of 2021-04-18) -- YOU HAVE BEEN WARNED!! - Breaking change:
CheckForUpdatesQuietly
now shows no UI ever. It could show a UI before, which didn't make a lot of sense based on the function name. Make sure that if you use this function that you handle showing a UI yourself if necessary. (See the HandleEventsYourself sample if you want help.) You can always trigger the built-inSparkleUpdater
by calling_sparkle.ShowUpdateNeededUI(updateInfo.Updates)
. - Breaking change: DLL assembly names for .NET Framework WinForms UI dlls changed from
NetSparkle.UI.WinForms
toNetSparkleUpdater.UI.WinForms
. - Breaking change: DLL assembly names for Avalonia UI dlls changed from
NetSparkle.UI.Avalonia
toNetSparkleUpdater.UI.Avalonia
. - We now rely on Portable.BouncyCastle (BouncyCastle.Crypto.dll) for the ed25519 implementation. This means there is another DLL to reference when you use NetSparkle!
- We now rely on System.Text.Json (netstandard2.0) OR Newtonsoft.Json (.NET Framework 4.5.2) for the JSON items. This means there is another DLL to reference when you use NetSparkle, and it will change depending on if the
System.Text.Json
orNewtonsoft.Json
item is used!