هل من المقبول جدولة الإجراء المخصص لـ RemoveExistingProducts قبل InstallValidate؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

مشكلة

لدي MSI يقوم بإنشاء خدمة Windows وتشغيلها أثناء التثبيت ويوقف الخدمة ويزيلها أثناء إلغاء التثبيت.يعمل هذا بشكل جيد عند التثبيت وإلغاء التثبيت من تلقاء نفسه، ولكن عند الترقية، لا يعمل هذا الملفات قيد الاستخدام يتم عرض مربع الحوار (فقط في نظام التشغيل Vista والإصدارات الأحدث بسبب الإصدار الجديد إعادة تشغيل مدير)، مما يشير إلى أن الخدمة قيد الاستخدام.

خلفية

ال الملفات قيد الاستخدام يتم عرض الحوار أثناء تثبيتتنفيذ تسلسل بواسطة InstallValidate الإجراء المخصص، والذي تمت جدولته مباشرة قبل إزالة المنتجات الموجودة إجراء مخصص؛وهذا يعني أن الإصدار السابق لم يتم إلغاء تثبيته بعد، وبالتالي فإن الملفات قيد الاستخدام الحوار يجب يتم اظهار.

تشير وثائق MSDN إلى أن إزالة المنتجات الموجودة يجب جدولة الإجراء بعد InstallValidate العمل، ولدي حاليا إزالة المنتجات الموجودة الإجراءات المقررة مباشرة بعد InstallValidate فعل.

الحل المحتمل

أرغب في إعادة جدولة إزالة المنتجات الموجودة إجراء مخصص مباشرة قبل InstallValidate إجراء مخصص بحيث يكون للتثبيت السابق فرصة لإيقاف الخدمة وإزالتها قبل الملفات قيد الاستخدام يظهر الحوار.لقد حاولت إعادة جدولة الإجراءات، ويبدو أنها تعمل بشكل صحيح دون أي آثار جانبية ضارة (على الرغم من أن السجل لا يزال يشير إلى أن InstallValidate يتم تنفيذ الإجراء قبل إزالة المنتجات الموجودة الإجراء)، ولكنني متردد في استخدام هذا الحل نظرًا لأنه ينتهك وثائق MSDN، وقد تكون هناك تأثيرات سلبية لم أراها بعد.

هل هناك اي احد جرب هذة؟البديل الآخر الوحيد الذي يمكنني التفكير فيه هو جعل التثبيت الجديد يوقف خدمة التثبيت القديم، ولكن هذا غير مرغوب فيه لأنه يتطلب أن يكون لدى التثبيت معلومات حول كافة التثبيتات القديمة التي يمكنه ترقيتها (إيقاف هذه الخدمة بالذات قد يتضمن المزيد بدلاً من مجرد مكالمة بسيطة إلى مدير الخدمة لإيقافها).

هل كانت مفيدة؟

المحلول

لقد قمت بتنفيذ الحل المحتمل الموضح في السؤال، وهو الجدولة إزالة المنتجات الموجودة مباشرة قبل InstallValidate.لم ألاحظ أي مشاكل حتى الآن، ولكنني سأقوم بالنشر مرة أخرى بعد أن يصبح التثبيت أكثر فائدة.

تحديث

يستخدم التثبيت لدينا هذا لبعض الوقت، ولم ألاحظ أي آثار سيئة.

نصائح أخرى

لقد تم دمجه بالفعل في MSI / Windows Installer ...المشكلة الوحيدة هي أن فئات برنامج التثبيت .NET لا تستخدم ميزات "تثبيت الخدمة" الخاصة بـ MSI.ما يحدث بالفعل هو أن MSI يحاول تثبيت الملفات وتشغيل أمر مخصص باستخدام الملفات المنسوخة للتو (وهذا هو كل ما يضعه Visual Studio في MSI).

لحلها، يمكنك تحرير MSI باستخدام ORCA وإضافة الصف التالي إلى ملف مراقبة الخدمة طاولة:

1   ServiceName 170     1   C__489628C5CC1144CB47F43E8BE7F3F31D

معرف المكون الذي يمكنك البحث عنه من جدول FILES ...لقد اخترت للتو معرف مكون ملف EXE الرئيسي.170 عبارة عن صورة نقطية تخبر Windows Installer بإيقاف الخدمة وحذفها عند التثبيت وإلغاء التثبيت.

سيؤدي هذا إلى تمهيد الطريق لمثبتي .NET لإضافة الخدمة ويمكنك استخدام ServiceController لبدء الخدمة بعد تثبيتها عبر أمر مخصص.

إحدى المشاكل المحتملة هي أنه إذا قام المستخدم بالإلغاء أثناء InstallValidate (على سبيل المثال،بسبب عدم وجود مساحة كافية على القرص أو وجود ملف قيد الاستخدام) أو أثناء التثبيت، ما هو سلوك التراجع.الوضع المثالي هو أن تكون حالة التطبيق هي نفسها كما كانت من قبل (على سبيل المثال.تم تثبيت التطبيق السابق).ربما تتخلى عن ذلك من خلال التسلسل الخاص بك، على الرغم من أن التراجع قد يكون ميزة يمكنك العيش بدونها.

أعتقد أن هذا سيساعدك دون انتهاك وثائق MSDN وتجنب أي مشكلات مستقبلية.ضع شرطًا "مثبت أو تم تثبيت الإصدار السابق" وستكون جيدًا عند الترقية أيضًا نظرًا لأنه تم تعيين الخاصية PREVIOUSVERSIONSINSTALLED قبل إجراء InstallValidate أثناء FindRelatedProducts.لا أعرف السبب ولكن الخاصية PREVIOUSVERSIONSINSTALLED لم يتم توثيقها في MSDN ولكنها موجودة ومفيدة جدًا بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top