Wix: Baris perintah BA terkelola tidak efektif

Saat bermain dengan TestBA Bootstrapper dari Bryan, pertama-tama saya diinstal 1.0.0.0. Kemudian saya menambah versi ke 1.0.0.1 dan mencatat prosesnya. Inilah bagian di mana baris perintah -uninstall -quite diteruskan selama pemutakhiran:

[2870:21C0][2014-02-24T17:46:38]i300: Apply begin 
[1A44:1E54][2014-02-24T17:46:41]i360: Creating a system restore point. 
[1A44:1E54][2014-02-24T17:47:15]i361: Created a system restore point. 
[1A44:1E54][2014-02-24T17:47:15]i000: Caching bundle from: 'C:\Users\fwaheed\AppData\Local\Temp\{57a07296-0310-4628-971c-2da38aa09f25}\.be\BootstrapperSetup.exe' to: 'C:\ProgramData\Package Cache\{57a07296-0310-4628-971c-2da38aa09f25}\BootstrapperSetup.exe' 
[1A44:1E54][2014-02-24T17:47:15]i320: Registering bundle dependency provider: {57a07296-0310-4628-971c-2da38aa09f25}, version: 1.0.0.1 
[1A44:2B40][2014-02-24T17:47:16]i305: Verified acquired payload: DummyInstallationPackageId at path: C:\ProgramData\Package Cache\.unverified\DummyInstallationPackageId, moving to: C:\ProgramData\Package Cache\{F1D62AA5-E68C-4B99-A6DD-D7EAE5A1D238}v1.0.0.1\DummyInstaller.msi. 
[1A44:1E54][2014-02-24T17:47:16]i323: Registering package dependency provider: {F1D62AA5-E68C-4B99-A6DD-D7EAE5A1D238}, version: 1.0.0.1, package: DummyInstallationPackageId 
[1A44:1E54][2014-02-24T17:47:16]i301: Applying execute package: DummyInstallationPackageId, action: Install, path: C:\ProgramData\Package Cache\{F1D62AA5-E68C-4B99-A6DD-D7EAE5A1D238}v1.0.0.1\DummyInstaller.msi, arguments: ' ARPSYSTEMCOMPONENT="1" MSIFASTINSTALL="7"' 
[2870:21C0][2014-02-24T17:47:22]i319: Applied execute package: DummyInstallationPackageId, result: 0x0, restart: None 
[1A44:1E54][2014-02-24T17:47:22]i325: Registering dependency: {57a07296-0310-4628-971c-2da38aa09f25} on package provider: {F1D62AA5-E68C-4B99-A6DD-D7EAE5A1D238}, package: DummyInstallationPackageId 
[1A44:1E54][2014-02-24T17:47:22]i301: Applying execute package: {f1d57671-5e3d-4be7-908f-5a47e72737d9}, action: Uninstall, path: C:\ProgramData\Package Cache\{f1d57671-5e3d-4be7-908f-5a47e72737d9}\BootstrapperSetup.exe, arguments: '"C:\ProgramData\Package Cache\{f1d57671-5e3d-4be7-908f-5a47e72737d9}\BootstrapperSetup.exe" -uninstall -quiet -burn.related.upgrade' 
[2870:21C0][2014-02-24T17:48:54]i319: Applied execute package: {f1d57671-5e3d-4be7-908f-5a47e72737d9}, result: 0x0, restart: None 
[2870:21C0][2014-02-24T17:48:54]i399: Apply complete, result: 0x0, restart: None, ba requested restart:  No 
[2870:21C0][2014-02-24T17:48:55]i500: Shutting down, exit code: 0x0 

Masalah: Alih-alih mencopot pemasangan secara diam-diam, ini akan menampilkan Dialog Pencopotan Pemasangan. Dan jika saya mengklik Uninstall, itu akan menghapus 1.0.0.0 dan kemudian aplikasi akan ditingkatkan ke 1.0.0.1.

Pertanyaan: Bagaimana cara membuatnya memahami argumen baris perintahnya dan melakukan prosesnya tanpa menampilkan kotak Dialog Uninstall?

Saya juga berkonsultasi dalam proyek WixBA dari sumber Wix 3.7, tetapi penanganan baris perintahnya hanya menangani argumen InstallFolder.

Saya akan sangat menghargai bantuan apa pun, karena skenario peningkatan ini memblokir proyek Bootstrapper saya.

Terima kasih banyak.


person Farrukh Waheed    schedule 24.02.2014    source sumber


Jawaban (2)


Kuncinya adalah mengambil tanda -quiet dan tidak menampilkan UI, melainkan hanya menjalankan tindakan yang diminta.

Ini diekspos melalui kelas dasar Bootstrapper menggunakan properti DisplayMode, yang menggunakan nilai Display enum. Pilihannya adalah

public enum Display
{
  Unknown,
  Embedded,
  None,
  Passive,
  Full,
}

Anda kemudian dapat menentukan tindakan mana yang akan dijalankan melalui nilai Command.Action (sekali lagi, di kelas dasar Bootstrapper) yang menggunakan LaunchAction enum. Pilihannya adalah:

public enum LaunchAction
{
 Unknown,
 Help,
 Layout,
 Uninstall,
 Install,
 Modify,
 Repair,

}

Jadi, saya telah menggunakan properti khusus yang saya beri nama RunningSilent untuk mendeteksi mode di mana saya tidak boleh menampilkan UI, lalu gunakan seperti yang ditunjukkan di bawah ini:

    /// <summary>
    /// True if running in silent display mode (ie: no UI).
    /// </summary>
    public virtual bool RunningSilent
    {
        get
        {
            return (DisplayMode != Display.Full && DisplayMode != Display.Passive);
        }
    }

    protected override void Run()
    {
        if (RunningSilent)
        {
             Log("Running without UI");
             LaunchAction requestedAction = Command.Action;
             //... this is an async call, so handle it accordingly.
             Engine.Plan(requestedAction);
             //... followed by Engine.Apply();

        }
        else
        {
            Log("Showing UI window");
            //.. Run your Managed UI
        }
    }
person John M. Wright    schedule 25.02.2014
comment
Terima kasih banyak @ John-m-wright. Putih mencoba menerapkan saran Anda, saya menghadapi beberapa masalah lagi, saya memposting di sini: stackoverflow.com/questions/22011578/. Silakan lihat juga ini jika saya membuat kesalahan di dalamnya. - person Farrukh Waheed; 25.02.2014

Terima kasih atas petunjuknya @John. Itu berhasil dengan bantuan petunjuk Anda. Inilah yang saya tambahkan di Run() sebelum meluncurkan Dialogs (Tampilan formulir):

if (Command.Display != Display.Full && Command.Action == LaunchAction.Uninstall)
{
   //MessageBox.Show("Let's do Uninstall silentley ");
   MyViewModel.PlanAction(LaunchAction.Uninstall);
}

BTW, dalam kasus saya, Command.Display adalah Display.Embeded, yang merupakan perilaku yang diharapkan.

Saya sangat menghargai tip Anda. Terima kasih lagi.

person Farrukh Waheed    schedule 26.02.2014