سؤال

بعد الكثير من التجارب، توصلت إلى استنتاج مفاده أن Windows Installer هو ببساطة تقنية سيئة.لكن العملاء يريدون ملفات MSI.

إذًا، كيف يمكنني إنشاء ملف MSI يستخرج ملف EXE إلى دليل مؤقت ويقوم بتشغيله بخيارات مماثلة أو مشابهة لتلك التي تم تمريرها إلى ملف EXE؟

تم شرح خيارات MSI في Msiexec (خيارات سطر الأوامر) (المستوى المنخفض "تشغيل" لـ MSI هو خيار msiexec package.msi).

يحرر:يبدو أن حل WiX الخاص بـ mjmarsh يعمل.لم تتح لي الفرصة لتجربتها بعد (وقت الذروة).إذا نجح الأمر، سأقبله.

يحرر:انه لا يعمل.القطعة المفقودة:لا يبدو أن الحضور/غير المراقب متاح.

على أي حال، الشيء الوحيد الذي يجعل هذا يعمل على الإطلاق هو أن يقوم الإجراء المخصص بقتل العملية الأصلية الخاصة به!

يحرر:لذلك نشر شخص ما كإجابة إضافية لتغليف الأمر برمته كإجراء مخصص بعد التثبيت.ممكن من الناحية النظرية ولكن نظرًا لأنه قد تكون هناك حاجة إلى إعادة التشغيل (شكرًا لـ MS على .NET 4 الذي يتطلب إعادة التشغيل في بعض الأحيان) يتعين علينا القيام بمزيد من القرصنة.لذلك من مصفوفة المزايا:

Transparency: No. One big custom action.
Customizability: No.
Standardization: No. 
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.

لا جدوى.

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

المحلول 4

لا يوجد حل. ذهبنا NSIS كما الشركات MSI تثبيت هو الذهاب الى كسر أي حال بسبب MSI مشكلة التعشيش (فقط <م> محاولة تثبيت EXE التفاف MSI من داخل MSI يوما ما).

نصائح أخرى

حسنًا، هناك الطريقة المجانية والطريقة $$$.لا أستطيع توثيق كل شيء هنا، ولكن هذا يجب أن يبدأ.

في ملاحظة جانبية، نعم، يعد Windows Installer تقنية مثيرة للجنون.في كثير من الأحيان أعتقد أن المهمة ستكون واضحة، لكنها في الواقع تصبح معقدة.عليك بالتأكيد أن تغمر نفسك لفهمها.

وعلى أية حال، فإليك ما يلي:

حر:ويكس (هنا)

هذه أداة مجانية لإنشاء ملفات MSI من مجموعة من ملفات تكوين XML.سأترك لك البحث عن البرامج التعليمية عبر الإنترنت، ولكن هنا هو جوهر الموضوع:

يمكنك ضغط ملف EXE في برنامج التثبيت باستخدام العلامة التالية في ملف WXS:

<Binary Id="MYEXE" src="<path to my exe?"/>

ثم يمكنك إنشاء إجراء مخصص يقوم بتشغيل ملف EXE الخاص بك:

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
      ExeCommand="my command line"/>

ثم تقوم بإدراج الإجراء المخصص الخاص بك في InstallExecuteSequence في المكان المناسب (دائمًا ما أقوم بتشغيل موقعي في مكان ما بينهما InstallInitialize و InstallFinalize)

<InstallExecuteSequence>
   <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>

$$$:احصل على InstallShield (هنا)

قم أولاً بإنشاء مشروع "Basic MSI" وتأكد من أنك تريد ذلك لم يتم إنشاء ملف setup.exe.قمت بتعيين هذا في إعدادات الإصدار.

ثم تفعل الشيء نفسه كما هو الحال مع WiX، ولكن لديك واجهة مستخدم له.

  • يمكنك تحديد ملف EXE المساعد الخاص بك باستخدام المحرر المباشر ووضع ملف EXE الخاص بك في الجدول "الثنائي"
  • يمكنك إنشاء إجراء مخصص لتشغيل ملف EXE هذا من عقدة "الإجراءات المخصصة" في الشجرة الموجودة على اليسار
  • يمكنك إدراج الإجراء المخصص عن طريق تحديد "تثبيت التسلسلات" ووضعه في ملف InstallExecuteSequence في مكان ما بين InstallInitialize و InstallFinalize كما قلت من قبل.

آسف، لا أستطيع أن أكون أكثر تفصيلا، ولكن ينبغي أن تكون هذه بداية جيدة.

وأعتقد أن أسهل طريقة لإنشاء ملف .MSI هي استخدام WIX .

الدرس 1 من البرنامج التعليمي WIX هو كل ما تحتاجه لخلق بسيطة التركيب.

جوشوا، أنا أفهم إحباطك جيدًا.أقل ما يقال عنه أن MSI هو طريقة جديدة تمامًا للتفكير في النشر.ومع ذلك، فإن تطبيق MSI بشكل صحيح يوفر أفضل نشر ممكن، خاصة لعملاء الشركات.

ما هي العمليات التي يقوم بها برنامج التثبيت EXE الخاص بك؟هل هو إلى حد كبير نسخ ملف، وبعض تسجيلات COM وبعض عمليات الكتابة في التسجيل، أم أنه يقوم بتشغيل منطق التثبيت المعقد، وإعداد قواعد البيانات وما إلى ذلك...؟سبب سؤالي هو أنه ربما يكون من السهل جدًا إنشاء WIX MSI يعمل بشكل جيد لك حتى تتمكن من التخلي عن نهج EXE.

من الممكن بالفعل تشغيل ملف EXE من داخل MSI، ولكنه يتطلب تسلسلًا مناسبًا، ومن المؤكد أنه سيسبب لك المزيد من الكآبة مقارنة بـ MSI البسيط.إذا كان التطبيق صغيرًا، ولا يفعل أي شيء مجنون أثناء التثبيت، فسيسعدني أن أقدم لك تحويل WIX الأساسي.

وهناك أيضا نسخة مجانية من MSI التفاف . كما أنها تدعم إلغاء وترقيات. أيضا، فإنه يخلق فقط إدخال واحد في إضافة أو إزالة البرامج.

وإضافة إلى الإجابة weir's، تغيير custom action attribute مثل أدناه:

<!--Run Action-->
    <CustomAction Id="RunWrappedExe"
                  Return="asyncNoWait"
                  FileKey="ApplicationFileId"
                  Execute="deferred"
                  ExeCommand=""
                  HideTarget="no"
                  Impersonate="yes"/>

ولا ينتظر إعداد Return=asyncNoWai لexe للعودة. المثبت يفعل ذلك هو العمل ويغلق بشكل طبيعي. وفي الوقت نفسه، exe المستمر تنفيذه.

و-Madhuresh

إذا كنت لا تريد إدارة MSI، ولكن فقط تنفيذ EXE، حاول <وأ href = "http://download.cnet.com/Exe-to-Msi-Converter-Free/3000-2216_4-10969236. أتش تي أم أل "يختلط =" نوفولو "> إكس إلى MSI تحويل الحرة . كنت وضعت للتو في المسار إلى EXE والحصول على MSI.

وحاول هذا:

في حزمة MSI، هناك دعوة السلوك "إطلاق تطبيق بعد التثبيت"، وهذا يعني وسيتم تنفيذ ملف إكس بك بعد تثبيت MSI (إغلاق MSI).

وحاول لتنفيذ إكس الخاص هناك، وذلك عندما إكس بك استدعاء حزم MSI أخرى، فإنه لن تتعارض مع أول واحد.

وWIX تستطيع ان تفعل ذلك. وإنني هنا نموذج التعليمات البرمجية لWIX 3.5:

<?xml version='1.0'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product Id='*' UpgradeCode="11111111-2222-3333-4444-555555555555" 
        Name='My Setup' Language='1033' Version='1.0.0.0' 
        Manufacturer='Your company'>

    <Package Description='pak' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='setup.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
        <Directory Id="TempFolder">
            <Directory Id="INSTALLLOCATION" Name="~_tmpdir">
                <Component Id='MyComponent' DiskId='1' Guid=''>
                    <File Id="File0" Name="setup.exe" Source="setup.exe" />
                    <File Id="File1" Name="file1.txt" Source="file1.txt" />
                </Component>
            </Directory>
        </Directory>
    </Directory>

    <Feature Id='InstallFeature' Title='Install Feature' Level='1'>
        <ComponentRef Id='MyComponent' />
    </Feature>

    <!-- Run Action -->
    <CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred" 
                  FileKey="File0" ExeCommand="setup.exe param here"  
                  HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
        <Custom Action="RunWrapExe" 
                After="InstallFiles">NOT REMOVE~="ALL"</Custom>
    </InstallExecuteSequence>

   </Product>
</Wix>

وكنت أعاني من نفس المشكلة (لف EXE، استدعاء MSI آخرين من EXE بما في ذلك الإعداد الصافية، وما إلى ذلك)، وهنا هو بلدي الحل:

وأبني إكس الإعداد باستخدام InstallAware. انها لديها MSI التفاف الخاصة التي يلتف EXE ولدت مع MSI.

وكان يعمل موافق، يمكن للEXE دعوة MSIS الآخرين دون أي مشكلة (بما في ذلك الإعداد الصافية، وغيرها من الاجهزة 3rd الطرف)، ولكن هذا لأن إطلاق نهايات MSI ( "العائدات") الحقوق بعد أن تطلق ملف EXE الإعداد، وبهذه الطريقة يتجنبون الحد MSI من العودية MSI المكالمات.

ولكن - بعض العملاء (شركات) الذي يستخدم أدوات النشر MSI، يتطلب MSI (MSIEXEC) للعودة (النهاية) إلا بعد انتهاء عملية الإعداد، وهذا هو وجود مشكلة في حل أعلاه

وهكذا - لحل هذه:

وهناك MSI التفاف آخر (exemsi.com) الذي يولد MSI وترجع فقط بعد انتهاء الإعداد EXE، ولكن لاستخدام ذلك يجب استخدام خيار آخر فريد من InstallAware:

وInstallAware لديه خيار لتوليد الإعداد EXE باستخدام محرك الأصلي الخاص بهم، وليس على أساس مشغل Windows المثبت، لتجنب MSI الحد العودية. الجمع بين تلك على حد سواء، وكان لديك الحل الأمثل.

وهذا الأمل سوف تساعد شخص ما، على الرغم من سنوات عديدة مرت منذ أن تم نشر هذا السؤال الأول.

وخدعة بسيطة:

صورة مشروع

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Setup
{
    internal class Program
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        private static void Main(string[] args)
        {
            ShowWindow(GetConsoleWindow(), 0);
            Stream st = Assembly.GetExecutingAssembly().GetManifestResourceStream("Setup.MSI.Temp.msi");
            string path = Path.Combine(System.IO.Path.GetTempPath(), "Temp.msi");
            using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                st.CopyTo(fileStream);
            }
            Process p = new Process();
            p.StartInfo.FileName = path;
            p.Start();
            p.WaitForExit();
            File.Delete(path);
        }
    }
}

ولقد تقدمت أداة. NET بسيطة ومجانية لإنشاء MSI من إكس أو مجلد (انها تستخدم wixsharp وWIX) http://legacy.averbouch.biz/free-msi-wrapper

وقام خلاله رجل، ومجرد استخدام معالج إعداد ابتكارات و. فإنه يجعل EXE الإعداد ولكن ليس MSI. انها مثل 5 دقائق، وسيكون لديك برنامج Windows Installer.

تحميل في هذا الشأن، وتثبيته، أشر إلى EXE الخاص بك، واتبع المطالبات التي تظهر على الشاشة

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