سؤال

لديّ تطبيق قمت بتحديثه مع بعض تجميعات .NET4 ، بما في ذلك الإجراءات المخصصة .DLL التي يتم تشغيلها عندما يتم إلغاء تثبيت التطبيق. تم تثبيت التطبيق في البداية باستخدام .NET 3.5 ويتطلب بعض الإجراءات المخصصة عند التثبيت وإلغاء التثبيت.

المشكلة هي أنه الآن عند إلغاء تثبيت .DLL للإجراءات المخصصة ، تغيرت إلى إصدار .NET 4 وأتلقى نظامًا. تم تصميم هذا التجميع بواسطة وقت تشغيل أحدث من وقت التشغيل الذي تم تحميله حاليًا ولا يمكن تحميله. اسم الملف: 'x'

هل يعرف أي شخص طريقة لإخبار الإلغاء لبدء العملية باستخدام .NET 4 بدلاً من الاتصال .NET 3.5 لتحميل الإجراءات المخصصة DLL؟ أين يتم تخزين معلومات إلغاء التثبيت هذه لكل منتج؟ وكيف؟

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

المحلول 3

بعد بحث طويل وجدت طريقة لحل المشكلة. لقد قدمت نسخة من التطبيق على .NET 4 وإنشاء المثبت. تم تثبيته ثم قارن ملف .msi يحفظ التطبيق على مجلد C: Windows Installer مع الإصدار السابق من نفس الملف ولكن مع .NET 3.5 (التثبيت الأصلي). ثم افتح كلا الملفين مع ORCAS وقمت بتغيير بعض قيم الخصائص واثنين من الملفات الثنائية على ملف .NET 3.5 MSI من ملف .NET 4 MSI الجديد.
الآن عندما أقوم بإجراء تحديث للملفات المفردة في التطبيق إلى إصدار .NET 4 منها (بحيث يتم تشغيل التطبيق تحت .NET 4) ، أحتاج أيضًا إلى تغيير ملف. MSI الموجود تحت C: Windows Installer ثم المثبت ثم عند إلغاء تثبيت برنامج Windows Installer ، سوف يستدعي .NET 4 للقيام بالإجراءات المخصصة بدلاً من .NET 3.5 والذي كان البناء الأصلي عند تثبيت التطبيق.

فيما يلي برنامج نصي يقوم بأتمتة العملية ولا داعي لاستخدام orcas ، ما عليك سوى تمرير ملف MSI لتغييره واثنين من DLL اللازمة (اللذين استخرجتهما من MSI من إصدار .NET 4).

var installer=new ActiveXObject("WindowsInstaller.Installer");
var db;
var msiOpenDatabaseModeTransact = 1;
var msiFile = WScript.Arguments.Item(0);
var installbuildfile = WScript.Arguments.Item(1);
var auxDllFile = WScript.Arguments.Item(2);
database = installer.OpenDatabase(msiFile, msiOpenDatabaseModeTransact);

    var view = database.OpenView("SELECT Name,Data FROM Binary");
    view.Execute();
    var rec;
    for (rec = view.Fetch(); rec != null; rec = view.Fetch()) {
        WScript.echo("Current SmartUpdater.exe version is: "+rec.StringData(1)); 
        if (rec.StringData(1) == "InstallUtil") {
            rec.SetStream(2, installbuildfile);
            view.Modify(2, rec)
            WScript.echo("Changed: " + rec.StringData(1)); 
        }
        if (rec.StringData(1) == "MSVBDPCADLL") {
            rec.SetStream(2, auxDllFile);
            view.Modify(2, rec)
            WScript.echo("Changed: " + rec.StringData(1)); 
        }
    }
    view.Close();
    view = database.OpenView("UPDATE Property SET Value='v4.0' WHERE Property='VSDFrameworkVersion'");
    view.Execute();
    view.Close();

database.Commit();

يمكن العثور على ملف installUtil DLL على دليل .NET ضمن C: Windows للإصدار 4.0 ، والثاني المسمى MSVBDPCADLL لا يزال MISTERY بالنسبة لي ، لكن يمكنني استخراجه من MSI من MSI .NET 4 (هناك يمكن أن تكون اختلافات ل 32 و 64 نسخًا ، وربما ستحتاج إلى استخراج الإصدارات المختلفة من DLLs)

نصائح أخرى

مرحبًا لاستهداف نسخة محددة من .NET Framework لـ App.exe القابلة للتنفيذ ، يمكنك وضع هذه الخطوط:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0.30319"/>
  </startup>
</configuration>

إلى ملف يسمى app.exe.config بالقرب من التنفيذ. إذا كان الملف موجودًا بالفعل ، فما عليك سوى دمج XMLs (تحرير: لقد وضعت 'v4.0.30319' لأن هذا هو الإصدار الذي لدي على جهاز الكمبيوتر الخاص بي ، ولكن يجب أن تضع الشخص الذي لديك ، وإلقاء نظرة على ٪ windir ٪ microsoft. Net Framework or ٪ windir ٪ microsoft.net framework64 للحصول عليه).

ربما لا تعرف اسم القابل للتنفيذ الذي إلغاء تثبيت البرنامج الخاص بك. في هذه الحالة ، قد تحاول استخدام Explorer Process للعثور عليها (http://www.windowsitpro.com/article/utilities/find-the-source-of-an-error-message.aspx).

لكن حذار: القيام بذلك سيغير هدف .NET FX لجميع عمليات التشغيل بنفس العملية ، وبالتالي (ربما) يغير سلوك كل إلغاء التثبيت الذي يتم مع هذا الإلغاء!

ما هو إصدار Windows Installer الذي تستخدمه؟ لا أستطيع أن أقول بالتأكيد ، لكنني أتساءل عما إذا كنت تستخدم إصدارًا أقدم من المثبت يريد لاستخدام إطار 3.5.

للتحقق ، انظر إلى خصائص مشروع الإعداد. انقر فوق "المتطلبات الأساسية" ، وانتقل إلى أسفل الحوار. تحقق من الإصدار الذي تريد استخدامه لعملية التثبيت.

بصراحة ، لم أكن أبداً/لاحظت هذه المشكلة ، لكنني أتساءل عما إذا كان استخدام مثبت Windows الأحدث سيصلحها.

Hello, SO!

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