
إطار تحديث البرامج القابل للتخصيص بسهولة لمشاريع C# .NET مع واجهة المستخدم المدمجة لـ WinForms و WPF و Avalonia
NetSparkle هو إطار تحديث للبرامج القابل للتكوين لـ C# يتوافق مع .NET 6+ و .NET Framework 4.6.2+ ، لديه واجهة مستخدم مسبقًا لـ .NET Framework (WinForms ، WPF) على الإطلاق! يمكنك تقديم تطبيق مع معلومات تحديث ومعلومات الإصدار في مكان ما على الإنترنت ، إلى جانب ملاحظات الإصدار بتنسيق Marmdown أو HTML. تساعدك هذه المكتبة بعد ذلك على التحقق من التحديث ، وإظهار المستخدم ملاحظات الإصدار ، وعرض تنزيل/تثبيت الإصدار الجديد من البرنامج.
أنواع تحميل التحديث المدمجة المدمجة:
يرجى الاطلاع على الترقية.
يتوفر Netsparkle عبر Nuget. لاختيار حزمة nuget لاستخدامها:
NetSparkleUpdater.SparkleUpdater package الأساسية إذا كنت لا تهتم بوجود واجهة مستخدم مدمجة ويمكنك إدارة الأشياء بنفسك| طَرد | استخدام الحالة | يطلق | معاينة | التنزيلات |
|---|---|---|---|---|
| netsparkleupdater.sparkleupdater | الحزمة الأساسية استخدم واجهة مستخدم مخصصة 100 ٪ أو لا واجهة مستخدم (لا شيء مدمج) | |||
| WinForms UI (.NET Framework) | Netsparkle مع واجهة مستخدم WinForms مدمجة | |||
| WinForms UI (.NET 6+) | Netsparkle مع واجهة مستخدم WinForms مدمجة | |||
| WPF UI (.NET Framework و .net 6+) | netsparkle مع واجهة مستخدم WPF مدمجة | |||
| أفالونيا واجهة المستخدم | Netsparkle مع Avalonia ui مدمج | |||
| أداة المولد المصبوب التطبيق | netsparkle-generate-appcast CLI Tool (بما في ذلك المساعدين ED25519) | |||
| أداة مساعد DSA | أداة netsparkle-dsa CLI (مساعدين DSA) |
معلومات سريعة لتثبيت الأدوات:
dotnet tool install --global NetSparkleUpdater.Tools.AppCastGenerator ؛ متاح كأغلفة netsparkle-generate-appcast على سطر الأوامر الخاص بك بعد التثبيتdotnet tool install --global NetSparkleUpdater.Tools.DSAHelper ؛ متاح كـ netsparkle-dsa على سطر الأوامر الخاص بك بعد التثبيت قد يبدو هذا مسار تحديث البرامج النموذجي لبرنامج نمطي من البرامج:
dotnet publish )في الوقت الحالي ، لا يساعدك NetSparkleupdater في 1. أو 2. أو 4. "لماذا لا؟" ، قد تسأل:
sudo لأي سبب من الأسباب ، فهناك مثال على القيام بذلك في عينة MacOS Avalonia .لإنشاء ملف App الخاص بك ، راجع قسم App Cast في هذا المستند.
نحن منفتحون على المساهمات التي قد تجعل عملية التثبيت/التحديث بشكل عام أسهل للمستخدم. يرجى تقديم مشكلة أولاً مع فكرتك قبل البدء في العمل حتى نتمكن من التحدث عنها.
يرجى إلقاء نظرة على المشاريع العينة في هذا المستودع لعينات الاستخدام الأساسية القابلة للتشغيل !! هناك عينات حول استخدام كل من واجهة المستخدم المدمجة بالإضافة إلى عينة "افعلها بنفسك في واجهة المستخدم الخاصة بك"!
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 أو النموذج الرئيسي أو ما شابه: 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) أو ملف DMG (Linux) أو ملف .tar.gz (Linux) أو ما شابه. مزيد من المعلومات في قسم كيفية عمل التحديثات.netsparkle-generate-appcast --help للخيارات): netsparkle-generate-appcast -b binary/folder -p change/log/folder -u https://example.com/downloads -l https://example.com/downloads/changelogs.signature أو ملفات مماثلة) إلى المواقع المناسبة على الخادم الخاص بكSparkleUpdater.LogWriter لمعرفة ما إذا كانت هناك أي معلومات تصحيح مفيدة تظهر على وحدة التحكم! في ملف المشروع الخاص بك ، تأكد من إعداد بعض الأشياء حتى تتمكن المكتبة من القراءة في التفاصيل ذات الصلة لاحقًا. ملاحظة: يمكنك استخدام IAssemblyAccessor لتحميل معلومات الإصدار من مكان آخر. ومع ذلك ، فإن إعداد الأشياء في ملف مشروعك أمر سهل ، ويمكن لـ NetSparkleupDater قراءة ذلك أصليًا!
< 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 > ملاحظة مهمة: في .NET 8+ ، تم إجراء تغيير في جوهر .NET الذي يتسبب في تضمين تجزئة CODE/Source Code في الرقم <Version> الخاص بتطبيقك. لا يمكن تجنب هذا السلوك بواسطة NetSparkleupdater في هذا الوقت لأننا نعتمد على AssemblyInformationalVersionAttribute ، وتم تغيير سلوك هذه السمة. قد يتم إخبار المستخدمين بأنهم يقومون حاليًا بتشغيل 1.0.0+commitHashHere بواسطة NetSparkleupDater (وتطبيقك الأصلي نفسه!). نوصي أيضًا بإضافة الأسطر التالية إلى ملف المشروع الخاص بك (في <PropertyGroup> أو خطاب جديد):
< 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!في الحدث الأول Application.Idle ، سيتم تنزيل ملف XML الخاص بك ، وقراءته ، ومقارنته بالإصدار الذي يتم تشغيله حاليًا. إذا كان يحتوي على تحديث للبرنامج في الداخل ، فسيتم إخطار المستخدم بإشعار الخبز المحمص (إذا كان مدعومًا من قبل واجهة المستخدم وتمكينه) أو مع مربع حوار تحديث يحتوي على ملاحظات الإصدار. يمكن للمستخدم بعد ذلك تجاهل التحديث ، أو طلب تذكيره لاحقًا ، أو تنزيله/تثبيته الآن.
إذا كنت ترغب في التحقق من إجراء تحديث في الخلفية دون رؤية المستخدم أي شيء ، فاستخدم
var updateInfo = _sparkle . CheckForUpdatesQuietly ( ) ;إذا كنت ترغب في الحصول على عنصر قائمة للمستخدم للتحقق من التحديثات حتى يتمكن المستخدم من رؤية واجهة المستخدم بينما يبحث Netsparkle عن التحديثات ، استخدم
_sparkle . CheckForUpdatesAtUserRequest ( ) ;إذا كان لديك ملفات تحتاج إلى حفظ ، اشترك في حدث الإعداد:
_sparkle . PreparingToExit += ( ( x , cancellable ) =>
{
// ask the user to save, whatever else is needed to close down gracefully
} ) ; لاحظ أنه إذا لم تستخدم UIFactory ، فيجب عليك استخدام أحداث CloseApplication أو CloseApplicationAsync لإغلاق التطبيق الخاص بك ؛ خلاف ذلك ، لن يتم تنفيذ/قراءة ملف التحديث الذي تم تنزيله! الاستثناء الوحيد لهذا هو إذا كنت تريد التعامل مع جميع جوانب تثبيت حزمة التحديث بنفسك.
الملف الذي يطلق التحديث الذي تم تنزيله القابل للتنفيذ فقط ينتظر 90 ثانية قبل الاستسلام! تأكد من إغلاق برنامجك في غضون 90 ثانية من CloseApplication/CloseApplicationAsync الذي يتم استدعاؤه إذا قمت بتنفيذ هذه الأحداث! إذا كنت بحاجة إلى حدث يمكن إلغاؤه ، مثل متى يحتاج المستخدم إلى سؤال ما إذا كان من المقبول إغلاق (على سبيل المثال لإنقاذ عملهم) ، استخدم PreparingForExit أو PreparingToExitAsync .
IUIFactory ؛ اضبط SparkleUpdater.UIFactory لاستخدام مثيل لكائنك.ICheckingForUpdates لمستخدمتك التي تخبر المستخدم بأن SparkleUpdater يتحقق من التحديثاتIDownloadProgress لواجهة واجهة المستخدم الخاصة بك والتي تُظهر للمستخدم أن التحديث يتم تنزيلهIUpdateAvailable لواجهة واجهة المستخدم الخاصة بك والتي تُظهر للمستخدم أن التحديث متاح جنبا إلى جنب مع ملاحظات الإصدارIAppCastDataDownloader لإعداد أساليبك الخاصة لتنزيل بيانات APP CAST ؛ قم بتعيين SparkleUpdater.AppCastDataDownloader لاستخدام مثيل لكائنك .. يتضمن NetSparkle تطبيقين افتراضيًا: WebRequestAppCastDataDownloader لتنزيل معلومات التطبيق من الإنترنت بشكل عام ، و LocalFileAppCastDownloader لنسخ/"تنزيل" APP من مسار معين من مسار معينIAppCastFilter لإجراء تصفية مخصصة على كائنات AppCastItem في طاقم التطبيق الذي تم تنزيله ، على سبيل المثال ، للنظر فقط في مجموعة فرعية معينة من العناصر كتحديثات صالحة لتطبيقك ؛ قم بتعيين AppCastHelper.AppCastFilter ( SparkleUpdater.AppCastHelper.AppCastFilter ) لاستخدام مثيل لكائنك. يتضمن NetSparkle فئة ChannelAppCastFilter ، والتي يمكنك استخدامها لتصفية العناصر بواسطة قناة منتج معينة (على سبيل المثال ألفا ، بيتا) إذا كان تطبيقك يستخدم هذه الميزات.IAppCastGenerator للتحكم في كيفية تسلسل APP لتصوير التطبيقات وتهلسلها ؛ اضبط SparkleUpdater.AppCastGenerator لاستخدام مثيل لكائنك. يتضمن NetSparkle تطبيقين: XMLAppCastGenerator ، لسلسلة XML/إزالة التسلسل ؛ و JsonAppCastGenerator ، لسلسلة JSON/deserialization. يمكن لـ App Cast Generator CLI أيضًا إخراج كل من CATS XML و JSON.IAssemblyAccessor للتحكم في كيفية تحميل الإصدار وحقوق الطبع والنشر وتفاصيل المنتج الأخرى لتطبيقك ؛ تعيين Configuration.AssemblyAccessor ( SparkleUpdater.Configuration.AssemblyAccessor ) لاستخدام مثيل لكائنك. يحتوي NetSparkle على تطبيق افتراضي ، AssemblyDiagnosticsAccessor ، والذي ينبغي أن يعمل في الحالة العامة لتحميل البيانات من مجموعة معينة.ILogger وتعيين SparkleUpdater.LogWriter . بشكل افتراضي ، يتم استخدام فئة LogWriter (التي تحتوي على خاصية LogWriterOutputMode للتحكم في ما إذا كانت السجلات مكتوبة إلى Console أو Trace وما إلى ذلك)ISignatureVerifier لتغيير كيفية معالجة تواقيعك الخاصة بالتطبيق ، والتنزيلات ، وما إلى ذلك ؛ اضبط SparkleUpdater.SignatureVerifier لاستخدام مثيل لكائنك.IUpdateDownloader لإعداد أساليبك الخاصة لتنزيل وإرسال التقدم على ملفات تحديث التطبيق (مثل مثبتات) لعنصر تمثيل تطبيق معين ؛ قم بتعيين SparkleUpdater.UpdateDownloader لاستخدام مثيل لكائنك .. يتضمن NetSparkle تطبيقين افتراضيًا: WebFileDownloader (افتراضي) لتنزيل الملفات من الويب/الإنترنت ، و LocalFileDownloader للنسخ/"تنزيل" ملف من مسار معين. Configuration الفئة الفرعية لتغيير كيفية حفظ بعض معلومات NetSparkle وتحميلها - على سبيل المثال ، معلومات الإصدار المتخطي. هذه الفئة هي الفئة التي تستخدم مثيل IAssemblyAccessor لحفظ وتحميل معلومات الإصدار ، واسم المنتج ، إلخ. يحتوي NetSparkle على ثلاثة تطبيقات: RegistryConfiguration ، الذي يحفظ وتحميل المعلومات إلى سجل Windows (افتراضي على Windows) ؛ JSONConfiguration ، الذي يحفظ وتحميل المعلومات إلى ملف JSON (افتراضي على MacOS/Linux) ؛ و DefaultConfiguration ، الذي لا يفعل شيئًا ويعمل بمثابة JSONConfiguration في حالة عدم إمكانية العثور على موقع ملف صالح لحفظ البيانات وتحميلها. لاستخدام مثيل الفصل الخاص بك ، اضبط SparkleUpdater.Configuration .RegistryConfiguration الفرعية تغيير مسار التسجيل بسرعة حيث يتم حفظ العناصر عبر BuildRegistryPathJSONConfiguration الفرعي تغيير مسار الملف بسرعة حيث يتم حفظ البيانات عبر GetSavePathAppCastHelper إذا كنت تريد التحكم الكامل في التطبيق الذي يقوم بتنزيله وتنزيل عملية التحليل. لاحظ أنه من المحتمل أن تفعل كل ما عليك القيام به عبر خصائص AppCastHelper (بما في ذلك IAppCastFilter AppCastFilter ) ، ولكن الفئة الفرعية ستمنحك التحكم الكامل والمطلق على العملية بأكملها. لاستخدام مثيل الفصل الخاص بك ، قم بتعيين SparkleUpdater.AppCastHelper .ReleaseNotesGrabber للتحكم في عملية تنزيل ملاحظات الإصدار (وبالتالي العرض). لاستخدام مثيل لفصلك ، قم بتعيين UIFactory.ReleaseNotesGrabberOverride .WebFileDownloader إذا كنت لا ترغب في تنفيذ IUpdateDownloader بنفسك وتريد فقط تجاوز وظيفة أو اثنتين مثل CreateHttpClient أو RetreiveDestinationFileNameAsync . لاستخدام مثيل للفصل ، قم بتعيين SparkleUpdater.UpdateDownloader .WebRequestAppCastDataDownloader إذا كنت لا ترغب في تنفيذ IAppCastDataDownloader وترغب فقط في تجاوز وظيفة أو اثنتين مثل CreateHttpClient . لاستخدام مثيل للفصل الدراسي الخاص بك ، قم بتعيين SparkleUpdater.AppCastDataDownloader .LogWriter لتنفيذ وظيفة PrintMessage ؛ نظرًا لأن ILogger عبارة عن واجهة بسيطة جدًا ، فربما يمكنك فقط تنفيذ تلك الواجهة بنفسك إذا كانت احتياجاتك معقدة. لاستخدام مثيل من فصلك ، قم بتعيين SparkleUpdater.LogWriter .SparkleUpdater لتنفيذ بعض الوظائف المختلفة المتعلقة بالتثبيت ، بما في ذلك:GetWindowsInstallerCommandGetInstallerCommandRunDownloadedInstallerGetDownloadPathForAppCastItemUIFactory إذا كنت لا ترغب في تنفيذ واجهة IUIFactory بأكملها وتريد فقط تكوين وظيفة أو اثنتين. لاستخدام مثيل للفصل ، قم بتعيين SparkleUpdater.UIFactory . IAppCastFilter يمكنك تغيير كيفية ترشيح عناصر عمل التطبيق الخاصة بك من خلال خاصية AppCastHelper.AppCastFilter (عبر واجهة IAppCastFilter ). يتيح لك ذلك تغيير العناصر المتاحة للمستخدمين النهائيين.
يحتوي NetSparkle على تطبيق IAppCastFilter المدمج لتصفية قائم على القناة تسمى ChannelAppCastFilter . للحصول على بعض الأمثلة حول كيفية استخدام تلك الفئة ، راجع اختبارات الوحدة هنا. في الأساس ، قم بتعيين خاصية List<string> ChannelSearchNames على القنوات التي تريد تصفيةها. إذا كنت ترغب في الاحتفاظ بالعناصر التي لا توجد معلومات قناة (على سبيل المثال 1.2.3 ) ، فستكون KeepItemsWithNoChannelInfo إلى true .
لتعيين القنوات فعليًا على عناصر تطبيق التطبيق الخاصة بك / في تطبيق التطبيق الخاص بك ، استخدم الخاصية --channel الخاصة بتطبيق CLI CLI ، أو تعيين خاصية <Version> لملف المشروع الخاص بك على الإصدار المتوافق مع SEMVER المعمول به (على سبيل المثال <Version>1.0.2-beta1</Version> ) ، وسوف يلتقط App CLI أداة CLI هذا تلقائيًا. أو ، إذا كنت تقوم بإنشاء تطبيقك يدويًا ، فقم بتعيين <sparkle:channel>YourChannelHere</sparkle:channel> على الخاص بك <item> (أو ، إذا كنت تستخدم json ، خاصية channel ).
لا يتعين استخدام NetSparkleupdater مع واجهة المستخدم على الإطلاق. يمكنك أن تفعل كل شيء بنفسك أو حتى أن تقوم المكتبة بتشغيل التحديث الذي تم تنزيله تلقائيًا عن طريق تعيين SparkleUpdater.UserInteractionMode = UserInteractionMode.DownloadAndInstall . يحتوي هذا الريبو على عينة عن فعل الأشياء بنفسك دون أي واجهة مستخدم مسبقة تم إنشاؤها في SRC/Netsparkle.samples.handleeventsyourself.
إذا كنت تريد واجهة المستخدم ، فنحن نقدم واجهة مستخدم مسبقًا في حزم Nuget مختلفة مع عدد صغير من الخيارات القابلة للتخصيص لـ WinForms و WPF و Avalonia. يتم تشغيل واجهة المستخدم عن طريق تطبيق IUIFactory ، يسمى UIFactory في كل من الخيارات المدمجة. يمكن تجاوز معظم الطرق في UIFactory إذا كنت ترغب في تعديل السلوك ، ويتيح لك ProcessWindowAfterInit تخصيص كل نافذة بعد صنعها.
إذا كنت ترغب في لف واجهة المستخدم الخاصة بك تمامًا ، فما عليك سوى تطبيق الواجهة IUIFactory مع أي مكتبة واجهة المستخدم التي تريد استخدامها. يمكنك نسخ أو إعادة استخدام نماذج العرض ، والرمز ، وما إلى ذلك ، من خيارات NetSparkleupDater المسبقة ، ونسخ+رمز لصق من هذا الريبو إلى بنفسك على الأرجح وسيلة جيدة وسريعة للبدء. لا تنسى تعيين خاصية SparkleUpdater.UIFactory مع مثيل لتطبيق IUIFactory الخاص بك ، على الرغم من!
يرجى ملاحظة: NetSparkle لا تحاول بشكل أساسي أي محاولات للقلق بشأن الترابط (على سبيل المثال ، استدعاء إلى الخيط الرئيسي) باستثناء حلقة الخلفية إلى مؤشر الترابط الرئيسي الذي بدأ مثيل SparkleUpdater . بمعنى آخر ، بشكل عام ، ستقوم NetSparkle بفعل كل شيء على الخيط الذي أنشأ في الأصل مثيل SparkleUpdater . بالنسبة لمعظم التطبيقات ، سيكون هذا جيدًا لأنها تستخدم فقط موضوع واجهة المستخدم الرئيسية. عندما تكون في شك ، بالنسبة لاحتياجات واجهة المستخدم الخاصة بك ، تأكد من التحقق InvokeRequired على winforms ، وعلى WPF/Avalonia ، Marshal Things to the UI Thread (إلا إذا كنت تستخدم ربط البيانات في هذه الحالة التي يتم التعامل معها من أجلك!).
إن تمرير تطبيق IUIFactory الخاص بك الذي يبدأ Windows/Things على مؤشرات ترابط جديدة إلى SparkleUpdater ليس تكوينًا مدعومًا. إذا كنت ترغب في تشغيل واجهة المستخدم الخاصة بك على مؤشرات ترابط متعددة (على سبيل المثال ، لا تتضمن WinForms نوافذ NetSparkleupdater عند إغلاق النموذج الرئيسي) ، فقم بذلك باستخدام أحداث SparkleUpdater وليس UIFactory ؛ يرجى أيضًا رؤية عينة SRC/NetSparkle.samples.Forms.MultithRead للحصول على مثال عملي على كيفية القيام بذلك.
App Cast هو مجرد ملف XML أو JSON. أنه يحتوي على حقول مثل عنوان ووصف منتجك بالإضافة إلى تعريف لكل إصدار من برنامجك.
نوصي بشدة أن تستفيد من أداة تطبيق NetSparkle-Generate-Generate لإنشاء (وبعد ذلك ، إعادة إنشاء/تحديث) ، لأنه يمكن أن يساعد في رعاية جميع متطلبات التوقيع لك.
dotnet tool install --global NetSparkleUpdater.Tools.AppCastGeneratornetsparkle-generate-appcast . يمكنك استخدام netsparkle-generate-appcast --help لرؤية قائمة كاملة من الخيارات لهذه الأداة. بشكل افتراضي ، يستخدم Netsparkle تطبيقات XML متوافقة مع التألق في معظم الأحيان . يستخدم NetSparkle sparkle:signature بدلاً من sparkle:edSignature حتى تتمكن من اختيار كيفية توقيع ملفاتك/تطبيقك. (إذا كنت ترغب في استخدام sparkle:edSignature ، تمرير- --use-ed25519-signature-attribute لمولد App Cast.) لاحظ أن NetSparkle متوافق مع وتوقيع ED25519 بشكل افتراضي ، ولكن يمكن لـ Framework التعامل مع تطبيق مختلف لفئة ISignatureVerifier للتحقق من أنواع مختلفة من التسجيلات دون وجود إصدارات في الإصدار/تحديثها.
فيما يلي نموذج تطبيق XML:
<? 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 علامات <item> لتحديد ما إذا كانت التحديثات متوفرة.
العلامات المهمة في كل <item> هي:
<description><sparkle:releaseNotesLink> .<sparkle:releaseNotesLink><description> موجودة ، فسيتم استخدامها بدلاً من ذلك.sparkle:signature ، اختياري: توقيع DSA/ED25519 للوثيقة ؛ لا يتحقق NetSparkle من هذا التوقيع من أجلك إلا إذا قمت بتعيين ReleaseNotesGrabber.ChecksReleaseNotesSignature إلى true ، ولكن يمكنك التحقق يدويًا من توقيعات Changelog إذا أردت أو تضع ReleaseNotesGrabber.ChecksReleaseNotesSignature = true<pubDate>sparkle:channel : قناة لهذا العنصر المصبوب ، مثل beta (غير مطلوب) - يقبل فقط قناة واحدة<enclosure>url : عنوان URL لملف التحديثsparkle:version : رقم الإصدار القابل للقراءة الآلي لهذا التحديثlength ، اختياري: (غير التحقق من صحة) حجم ملف التحديث بالبايتtype : تم تجاهلهsparkle:signature : DSA/ED25519 توقيع ملف التحديثsparkle:criticalUpdate ، اختياري: إذا كان مساويًا true أو 1 ، فسيشير واجهة المستخدم إلى أن هذا تحديث حاسمsparkle:os : نظام التشغيل لعنصر App Cast. الإعدادات الافتراضية إلى Windows إذا لم يتم توفيرها. بالنسبة لنظام التشغيل Windows ، استخدم "Win" أو "Windows" ؛ بالنسبة إلى MacOS ، استخدم "MacOS" أو "OSX" ؛ للينكس ، استخدم "Linux". بشكل افتراضي ، تحتاج إلى توقيعات ( SecurityMode.Strict ):
sparkle:signature="..." )ملاحظة: تقوم أداة المولد المصبوب التطبيق بإنشاء كل من هذه التواقيع لك عندما تقوم بإعادة إنشاء ملف appcast.xml.
يمكنك إنشاء توقيعات ED25519 باستخدام أداة AppCastGenerator (من حزمة Nuget هذه أو في الكود المصدري هنا). تتطلب هذه الأداة .NET 6 أو 7 أو 8 أو 9 لوقت تشغيل سطح المكتب. يرجى الاطلاع على الأقسام أدناه للخيارات والأمثلة على إنشاء مفاتيح ED25519 واستخدامها عند إنشاء تطبيق.
AppCastGenerator (من حزمة Nuget هذه أو في الكود المصدري هنا) لإنشاء ملف App Cast بسهولة. الخيارات المتاحة موصوفة أدناه. يمكنك تثبيته على CLI عبر dotnet tool install --global NetSparkleUpdater.Tools.AppCastGenerator .string.Format أو ما شابه شيء رائع).إذا كنت ترغب في استخدام تطبيق JSON بدلاً من XML:
--output-type json عند إنشاء ملف عمل التطبيق الخاص بك عبر مولد App CastSparkleUpdater.AppCastGenerator إلى new JsonAppCastGenerator(mySparkleUpdater.LogWriter) .JsonAppCastGenerator.HumanReadableOutput على false .تفتقد بعض الخيارات التي ترغب في رؤيتها؟ تقديم مشكلة على هذا الريبو أو أضفها بنفسك وأرسل لنا طلب سحب!
--show-examples : طباعة أمثلة على الاستخدام إلى وحدة التحكم.--help : إظهار جميع الخيارات وأوصافها. -a / --appcast-output-directory : دليل لكتابة ملف appcast.xml الإخراج. مثال الاستخدام: -a ./MyAppCastOutput-e / --ext : عند البحث عن ملفات لإضافتها إلى App Cast ، استخدم الامتداد (s) المحدد عند البحث عن الملفات. الإعدادات الافتراضية إلى exe . مثال الاستخدام: -e exe,msi-b / --binaries : مسار الملف إلى الدليل الذي يجب البحث عنه عند البحث عن ملفات لإضافتها إلى App Cast. الافتراضات ل . . مثال الاستخدام: -b my/build/directory-r / --search-binary-subdirectories : صحيح للبحث في الدليل الثنائي بشكل متكرر للثنائيات ؛ خطأ للبحث فقط في الدليل الأعلى. الإعدادات الافتراضية إلى false . مثال الاستخدام: -r .--single-file : يتم تجاهل ملف واحد لإضافته إلى تطبيق App Cast-إذا تم تعيينه ، --binaries ، --ext ، وما إلى ذلك. من المفيد الاستخدام إذا كان ملف الإخراج الخاص بك لا يحتوي على امتداد (على سبيل المثال هو غير قابل للتنفيذ). مثال استخدم: --single-file path/to/my/file-f / --file-extract-version : ما إذا كان سيتم استخراج إصدار الملف من اسم الملف بدلاً من الملف (مثل DLL) نفسه. الإعدادات الافتراضية إلى false . استخدم عندما يكون لدى ملفاتك التي سيتم تنزيلها بواسطة NetSparkleupDater رقم الإصدار في اسم الملف ، على سبيل المثال "My App 1.3.2-alpha1.exe". لاحظ أن هذا يبحث فقط عن عناصر/مجلدات الدليل الأربعة الأخيرة. مثال الاستخدام: -f true--file-version لاحظ أنه لا يمكن تعيين هذا الإصدار إلا مرة واحدة ، لذلك عند إنشاء تطبيق تطبيق ، تأكد من أنك أيضًا: أ) لديك ثنائي واحد فقط في تطبيق التطبيق الخاص بك | ب) الاستفادة من المعلمة --reparse-existing حتى يتم التقاط العناصر القديمة. إذا وجد المولد ثنائيين دون أي نسخة معروفة و --file-version ، فسيتم تنبعث خطأ. مثال الاستخدام: --file-version 1.3.2-o / --os : نظام التشغيل الذي ينتمي إليه العناصر التي يلقي التطبيق. يجب أن تتضمن السلسلة واحدة مما يلي: windows و mac و linux . الافتراضات إلى windows . مثال الاستخدام: -o macos-arm64 ؛ -o windows-x64--description-tag : نص لوضعه في التطبيق وصف العلامة/المعلومات. الإعدادات الافتراضية إلى "أحدث التغييرات مع الروابط إلى التحديثات". مثال استخدم: --description-tag "Hello I am a Cool App"--link-tag : نص لوضعه في التطبيق/معلومات link المصبوب. يجب أن يكون التطبيق الخاص بك url تنزيل url إذا كنت تستخدم هذا. مثال استخدم: --link-tag https://mysite.com/coolapp/appcast.xml-u / --base-url : جزء من عنوان URL لاستخدامه في التنزيلات. سيتم وضع اسم الملف الذي سيتم تنزيله بعد هذا الجزء من عنوان URL. مثال استخدام: -u https://myawesomecompany.com/downloads-l / --change-log-url : بداية جزء من عنوان URL لاستخدامها في ملفات سجل التغيير الخاصة بك. سيتم وضع ملف سجل التغيير الذي سيتم تنزيله بعد هذا الجزء من عنوان URL. إذا لم يتم تحديد هذا الخيار ، فسيتم وضع بيانات سجل التغيير في التطبيق الذي يلقي نفسه. مثال استخدام: -l https://myawesomecompany.com/changes-p / --change-log-path : مسار إلى ملفات سجل التغيير لبرنامجك. من المتوقع أن تكون هذه في شكل تخفيض مع امتداد .md . يجب أن يحتوي اسم ملف ملفات سجل التغيير على إصدار البرنامج ، على سبيل المثال 1.3.2.md مثال استخدم: -p path/to/change/logs . (ملاحظة: سيحاول المولد أيضًا العثور على سجلات التغيير التي يتم تنسيق أسماء ملفاتها مثل SO: MyApp 1.3.2.md )--change-log-name-prefix : بادئة لتغيير أسماء ملفات السجل. بشكل افتراضي ، يبحث المولد عن أسماء الملفات مع التنسيق "[الإصدار] .md". إذا قمت بتعيين هذه المعلمة (على سبيل المثال) "سجل تغيير التطبيق الخاص بي" ، فسيبحث عن أسماء الملفات مع التنسيق "My App Change Log [الإصدار] .md" وكذلك "[الإصدار] .md".-n / --product-name : اسم المنتج لبرنامجك. تستخدم عند تعيين عنوان التطبيق الخاص بك وعناصره. الإعدادات الافتراضية Application . مثال استخدام: -n "My Awesome App"-x / --url-prefix-version : أضف رقم الإصدار كبادئة إلى اسم الملف لعنوان URL للتنزيل. الإعدادات الافتراضية إلى خطأ. على سبيل المثال ، إذا --base-url هو www.example.com/downloads ، فإن الإصدار الخاص بك هو 1.4.2 ، واسم التطبيق الخاص بك هو MyApp.exe ، سيصبح عنوان URL الخاص بك www.example.com/downloads/1.4.2/MyApp.exe . مثال الاستخدام: -x true .--key-path : Path to NetSparkle_Ed25519.priv و NetSparkle_Ed25519.pub Files ، والتي هي مفاتيحك الخاصة والعام ED25519 الخاص بك لتحديثات البرامج الخاصة بك ، على التوالي. مثال استخدام: --key-path my/path/to/keysSPARKLE_PRIVATE_KEY و SPARKLE_PUBLIC_KEY قبل تشغيل generate_appcast . تعطي الأداة أولوية مفاتيح البيئة على المفاتيح التي تجلس على القرص!--signature-file-extension : التمديد (بدون . ) لاستخدامه في ملف توقيع App Cast. الإعدادات الافتراضية signature . مثال الاستخدام: --signature-file-extension txt .--output-file-name : اسم ملف الإخراج للتطبيق المصبوب مع . أو التمديد. يتم التحكم في التمديد بما إذا كان إخراج XML أو JSON ولم يكن قابلاً للتكوين. الإعدادات الافتراضية إلى "appcast". بالطبع ، يمكنك دائمًا تغيير هذا لاحقًا بمفردك بعد أن تم إنشاء تطبيق التطبيق ؛ هذا الخيار هو فقط للراحة. مثال استخدم: --output-file-name super_app_download_info .--use-ed25519-signature-attribute : إذا كان ذلك صحيحًا والقيام بإخراج XML ، فإن سمة توقيع الإخراج في XML ستكون edSignature بدلاً من signature لتتناسب مع مكتبة Sparkle الأصلية. لا يوجد تأثير على تطبيقات تطبيق JSON.--file-version لاحظ أنه لا يمكن تعيين هذا الإصدار إلا مرة واحدة ، لذلك عند إنشاء تطبيق تطبيق ، تأكد من أنك أيضًا: أ) لديك ثنائي واحد فقط في تطبيق التطبيق الخاص بك | ب) الاستفادة من المعلمة --reparse-existing حتى يتم التقاط العناصر القديمة. إذا وجد المولد ثنائيين دون أي نسخة معروفة و --file-version ، فسيتم تنبعث خطأ.--critical-versions : قائمة الإصدارات المفصولة بفاصلة للاحتفال بالحرجة في App App Cast. يجب مطابقة نص الإصدار بالضبط. على سبيل المثال ، "1.0.2،1.2.3.1".--reparse-existing : إعادة تشغيل تطبيق موجود بدلاً من تجاوزه وإنشائه من جديد. تتخطى الإصدارات الموجودة بالفعل في التطبيق ، لذلك إذا قمت بنشر ثنائي جديد مع نفس الإصدار ، فستحتاج إلى تحرير تطبيق التطبيق الخاص بك يدويًا لإزالة القائمة القديمة للإصدار الذي تعيد النشر. مثال الاستخدام: --reparse-existing true--overwrite-old-items : تسبب إعادة كتابة عناصر APP CAST في التطبيق المصبوب إذا تم العثور على ثنائي على القرص مع نفس رقم الإصدار. وبعبارة أخرى ، إذا كان 1.0.1 في التطبيق يلقي بالفعل (إما من إعادة تمييز أو من ثنائي آخر) ، ويتم العثور على 1.0.1 أخرى على القرص ، فسيتم إعادة كتابة بيانات 1.0.1 في App App استنادًا إلى الثنائي الموجود. لاحظ أن هذا يعني أنه إذا كان لديك إصدارات متعددة 1.0.1 على القرص (والتي يجب ألا تفعل ...) ، فإن آخر إصدار تم العثور عليه سيكون هو الذي في تطبيقك! مثال الاستخدام: --overwrite-old-items--human-readable : إذا كان ذلك صحيحًا ، فإن تطبيق تطبيق الإخراج يلقي القراءة البشرية (خطوط الأخبار ، المسافة البادئة). مثال الاستخدام: --human-readable true--channel : اسم قناة الإصدار لأي عناصر تمت إضافتها في App App Cast. يجب أن تكون قناة واحدة. 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.
لا. 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.)
نعم. 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.
نعم!
--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.
نعم.
نعم.
نعم. 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.
نعم. 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.
نعم. 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.نعم! 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! شكرًا لك!! :) 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: