2015-07-20 143 views
1

主要升級在以下安裝時無法正常工作。
如果在當前PC上安裝了以前版本的應用程序,則在主要升級期間,舊版本將自動卸載,但由於某種原因未安裝新版本。
我需要運行這個新安裝兩次,才能卸載舊版本,然後安裝新版本。
但是,如果我在舊版本的安裝中註釋掉自定義操作LaunchApplication,則不會有任何問題,並且在新安裝的一次運行期間將會卸載舊版本並安裝新版本。安裝應執行兩次以安裝應用程序的主要升級

<?xml version='1.0' encoding='windows-1252'?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

    <Product Name='Foobar 2.0.0' Id='GUID' UpgradeCode='GUID' 
    Language='1033' Codepage='1252' Version='2.0.0' Manufacturer='Acme Ltd.'> 

    <Package Id='*' Keywords='Installer' Description="Acme's Foobar 2.0.0 Installer" 
     Comments='Foobar is a registered trademark of Acme Ltd.' Manufacturer='Acme Ltd.' 
     InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' /> 

    <Property Id="ALLUSERS" Secure="yes" Value="2" /> 
    <Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1" /> 
    <Property Id='ApplicationFolderName' Value="Acme" /> 
    <Property Id='WixAppFolder' Value="WixPerUserFolder" /> 

    <Upgrade Id='GUID'> 
     <UpgradeVersion OnlyDetect='no' Property='PREVIOUSFOUND' 
      Minimum='0.0.1' IncludeMinimum='yes' 
      Maximum='2.0.0' IncludeMaximum='no' /> 
      <UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND' 
      Minimum='2.0.0' IncludeMinimum='no' /> 
    </Upgrade> 

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" /> 
    <Property Id='DiskPrompt' Value="Acme's Foobar 2.0.0 Installation [1]" /> 

    <Directory Id='TARGETDIR' Name='SourceDir'> 
     <Directory Id='ProgramFilesFolder' Name='PFiles'> 
     <Directory Id='Acme' Name='Acme'> 
      <Directory Id='INSTALLDIR' Name='Foobar 2.0.0'> 
      </Directory> 
     </Directory> 
     </Directory> 
    </Directory> 

    <DirectoryRef Id="INSTALLDIR"> 
     <Component Id='start.vbs' Guid='GUID'> 
      <File Id='start.vbs' Name='start.vbs' DiskId='1' Source='start.vbs' KeyPath='yes' > 
      </File> 
     </Component> 
    </DirectoryRef> 

    <Feature Id='Complete' Title='Foobar 2.0.0' Description='The complete package.' 
     Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR'> 
     <Feature Id='MainProgram' Title='Program' Description='The main executable.' Level='1'> 
     <ComponentRef Id='start.vbs' /> 
     </Feature> 
    </Feature> 

    <CustomAction Id='AlreadyUpdated' Error='[ProductName] has already been updated to 2.0.0 or newer.' /> 
    <CustomAction Id='NoDowngrade' Error='A later version of [ProductName] is already installed.' /> 

    <Property Id="WixShellExecTarget" Value="[#start.vbs]" /> 
    <CustomAction Id="LaunchApplication" 
     BinaryKey="WixCA" 
     DllEntry="WixShellExec" 
     Execute="immediate" 
     Impersonate="yes" /> 

    <InstallExecuteSequence> 
     <Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom> 
     <Custom Action="NoDowngrade" After="FindRelatedProducts">NEWERFOUND</Custom> 

     <RemoveExistingProducts Before="InstallInitialize" /> 

     <Custom Action="LaunchApplication" After="InstallFinalize"/> 

    </InstallExecuteSequence> 
    </Product> 
</Wix> 

此安裝或自定義操作有什麼問題?
VBS程序爲空。
start.vbs:

Private Function startServerSub() 
End Function 
startServerSub 

什麼應改爲必須卸載以前的版本,新的應用的一個運行過程中安裝新的能力嗎?

更新:
我改變了我的安裝了一下。
1. RemoveExistingProducts將在InstallInitialize之後執行。
2.添加SELFFOUND升級元素。

<?xml version='1.0' encoding='windows-1252'?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

    <Product Name='TestApp 2.0.0' Id='GUID' UpgradeCode='GUID' 
    Language='1033' Codepage='1252' Version='2.0.0' Manufacturer='TestManufacturer Ltd.'> 

    <Package Id='*' Keywords='Installer' Description="TestManufacturer's TestApp 2.0.0 Installer" 
     Comments='TestAppis a registered trademark of TestManufacturer Ltd.' Manufacturer='TestManufacturer Ltd.' 
     InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' /> 

    <Property Id="ALLUSERS" Secure="yes" Value="2" /> 
    <Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1" /> 
    <Property Id='ApplicationFolderName' Value="TestManufacturer" /> 
    <Property Id='WixAppFolder' Value="WixPerUserFolder" /> 

    <Upgrade Id='GUID'> 
     <UpgradeVersion OnlyDetect='yes' Property='SELFFOUND' 
      Minimum='2.0.0' IncludeMinimum='yes' 
      Maximum='2.0.0' IncludeMaximum='yes' /> 
     <UpgradeVersion OnlyDetect='no' Property='PREVIOUSFOUND' 
      Minimum='0.0.1' IncludeMinimum='yes' 
      Maximum='2.0.0' IncludeMaximum='no' /> 
      <UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND' 
      Minimum='2.0.0' IncludeMinimum='no' /> 
    </Upgrade> 

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" /> 
    <Property Id='DiskPrompt' Value="TestManufacturer's TestApp 2.0.0 Installation [1]" /> 

    <Directory Id='TARGETDIR' Name='SourceDir'> 
     <Directory Id='ProgramFilesFolder' Name='PFiles'> 
     <Directory Id='TestManufacturer' Name='TestManufacturer'> 
      <Directory Id='INSTALLDIR' Name='TestApp 2.0.0'> 
      </Directory> 
     </Directory> 
     </Directory> 
    </Directory> 

    <DirectoryRef Id="INSTALLDIR"> 
     <Component Id='start.vbs' Guid='GUID'> 
      <File Id='start.vbs' Name='start.vbs' DiskId='1' Source='start.vbs' KeyPath='yes' > 
      </File> 
     </Component> 
    </DirectoryRef> 

    <Feature Id='Complete' Title='TestApp 2.0.0' Description='The complete package.' 
     Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR'> 
     <Feature Id='MainProgram' Title='Program' Description='The main executable.' Level='1'> 
     <ComponentRef Id='start.vbs' /> 
     </Feature> 
    </Feature> 

    <CustomAction Id='AlreadyUpdated' Error='[ProductName] has already been updated to 2.0.0 or newer.' /> 
    <CustomAction Id='NoDowngrade' Error='A later version of [ProductName] is already installed.' /> 

    <Property Id="WixShellExecTarget" Value="[#start.vbs]" /> 
    <CustomAction Id="LaunchApplication" 
     BinaryKey="WixCA" 
     DllEntry="WixShellExec" 
     Execute="immediate" 
     Impersonate="yes" /> 

    <InstallExecuteSequence> 
     <Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom> 
     <Custom Action="NoDowngrade" After="FindRelatedProducts">NEWERFOUND</Custom> 

     <RemoveExistingProducts After="InstallInitialize" /> 

     <Custom Action="LaunchApplication" After="InstallFinalize"/> 

    </InstallExecuteSequence> 

    </Product> 
</Wix> 

然後創建4個安裝包:
1. InstallFinalize後自定義操作LaunchApplication版本1.0.0。
2.版本1.0.0無自定義操作LaunchApplication。
3.在InstallFinalize之後的2.0.0版自定義操作LaunchApplication。
4.版本2.0.0無自定義操作LaunchApplication。

如果安裝了帶自定義操作的1.0.0版,則無法安裝任何類型的2.0.0版。

我試圖1.0.0版(帶自定義操作)後安裝版本2.0.0(沒有自定義操作):

=== Verbose logging started: 7/22/2015 18:37:48 Build type: SHIP UNICODE 5.00.7601.00 Calling process: C:\Windows\system32\msiexec.EXE === 
... 
Action 18:37:48: FindRelatedProducts. Searching for related applications 
Action start 18:37:48: FindRelatedProducts. 
FindRelatedProducts: Found application: {GUID of 1.0.0} 
MSI (c) (A8:A4) [18:37:48:221]: PROPERTY CHANGE: Adding PREVIOUSFOUND property. Its value is '{GUID of 1.0.0}'. 
... 
Action start 18:37:48: InstallInitialize. 
MSI (s) (F4:0C) [18:37:48:299]: Machine policy value 'AlwaysInstallElevated' is 0 
MSI (s) (F4:0C) [18:37:48:299]: User policy value 'AlwaysInstallElevated' is 0 
MSI (s) (F4:0C) [18:37:48:299]: BeginTransaction: Locking Server 
MSI (s) (F4:0C) [18:37:48:299]: Note: 1: 1715 2: TestApp 2.0.0 
MSI (s) (F4:0C) [18:37:48:299]: Note: 1: 2262 2: Error 3: -2147287038 
MSI (s) (F4:0C) [18:37:48:299]: Calling SRSetRestorePoint API. dwRestorePtType: 0, dwEventType: 102, llSequenceNumber: 0, szDescription: "Installed TestApp 2.0.0". 
MSI (s) (F4:0C) [18:37:48:299]: The System Restore service is disabled. Returned status: 1058. GetLastError() returned: 1058 
MSI (s) (F4:0C) [18:37:48:299]: Server not locked: locking for product {GUID of 2.0.0} 
Action ended 18:37:48: InstallInitialize. Return value 1. 
MSI (s) (F4:0C) [18:37:48:845]: Doing action: RemoveExistingProducts 
MSI (s) (F4:0C) [18:37:48:845]: Note: 1: 2205 2: 3: ActionText 
Action start 18:37:48: RemoveExistingProducts. 
MSI (s) (F4:0C) [18:37:48:845]: Note: 1: 2262 2: Error 3: -2147287038 
MSI (s) (F4:0C) [18:37:48:845]: Note: 1: 2262 2: Error 3: -2147287038 
... 
Action start 18:37:48: InstallFinalize. 
... 
MSI (s) (F4:AC) [18:37:48:939]: Verifying accessibility of file: start.vbs 
MSI (s) (F4:AC) [18:37:48:939]: Note: 1: 2318 2:  
MSI (s) (F4:AC) [18:37:48:939]: Note: 1: 2318 2:  
... 
Action ended 18:37:48: InstallFinalize. Return value 1. 
MSI (s) (F4:AC) [18:37:48:939]: Doing action: LaunchApplication 
MSI (s) (F4:AC) [18:37:48:939]: Note: 1: 2205 2: 3: ActionText 
Action start 18:37:48: LaunchApplication. 
MSI (s) (F4:AC) [18:37:48:939]: Creating MSIHANDLE (9) of type 790542 for thread 8108 
MSI (s) (F4:B0) [18:37:48:939]: Invoking remote custom action. DLL: C:\Windows\Installer\MSIECB.tmp, Entrypoint: WixShellExec 
MSI (s) (F4:24) [18:37:48:939]: Generating random cookie. 
MSI (s) (F4:24) [18:37:48:939]: Created Custom Action Server with PID 8596 (0x2194). 
MSI (s) (F4:48) [18:37:48:970]: Running as a service. 
MSI (s) (F4:48) [18:37:48:970]: Hello, I'm your 32bit Impersonated custom action server. 
MSI (s) (F4!74) [18:37:49:001]: Creating MSIHANDLE (10) of type 790541 for thread 1140 
MSI (s) (F4!74) [18:37:49:001]: Creating MSIHANDLE (11) of type 790531 for thread 1140 
MSI (s) (F4!74) [18:37:49:001]: Closing MSIHANDLE (11) of type 790531 for thread 1140 
MSI (s) (F4!74) [18:37:49:001]: Creating MSIHANDLE (12) of type 790531 for thread 1140 
WixShellExec: Error 0x80070002: ShellExec failed with return code 2 
MSI (s) (F4!74) [18:37:49:001]: Closing MSIHANDLE (12) of type 790531 for thread 1140 
MSI (s) (F4!74) [18:37:49:017]: Creating MSIHANDLE (13) of type 790531 for thread 1140 
WixShellExec: Error 0x80070002: failed to launch target 
MSI (s) (F4!74) [18:37:49:017]: Closing MSIHANDLE (13) of type 790531 for thread 1140 
MSI (s) (F4!74) [18:37:49:017]: Closing MSIHANDLE (10) of type 790541 for thread 1140 
CustomAction LaunchApplication returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox) 
MSI (s) (F4:B0) [18:37:49:017]: Closing MSIHANDLE (9) of type 790542 for thread 8108 
Action ended 18:37:49: LaunchApplication. Return value 3. 
Action ended 18:37:49: INSTALL. Return value 3. 
... 
Property(N): WixShellExecTarget = [#start.vbs] 
... 
CustomAction returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox) 
MSI (s) (F4:0C) [18:37:49:017]: Note: 1: 2262 2: Error 3: -2147287038 
MSI (s) (F4:0C) [18:37:49:017]: Note: 1: 2262 2: Error 3: -2147287038 
Action ended 18:37:49: RemoveExistingProducts. Return value 3. 
MSI (s) (F4:0C) [18:37:49:017]: User policy value 'DisableRollback' is 0 
MSI (s) (F4:0C) [18:37:49:017]: Machine policy value 'DisableRollback' is 0 
MSI (s) (F4:0C) [18:37:49:017]: Executing op: Header(Signature=1397708873,Version=500,Timestamp=1190565049,LangId=1033,Platform=0,ScriptType=2,ScriptMajorVersion=21,ScriptMinorVersion=4,ScriptAttributes=0) 
MSI (s) (F4:0C) [18:37:49:017]: Executing op: DialogInfo(Type=0,Argument=1033) 
MSI (s) (F4:0C) [18:37:49:017]: Executing op: DialogInfo(Type=1,Argument=TestApp 1.0.0) 
MSI (s) (F4:0C) [18:37:49:017]: Executing op: RollbackInfo(,RollbackAction=Rollback,RollbackDescription=Rolling back action:,RollbackTemplate=[1],CleanupAction=RollbackCleanup,CleanupDescription=Removing backup files,CleanupTemplate=File: [1]) 
MSI (s) (F4:0C) [18:37:49:017]: Executing op: SetTargetFolder(Folder=C:\Users\user1\AppData\Local\Programs\TestManufacturer\TestApp 1.0.0\) 
MSI (s) (F4:0C) [18:37:49:017]: Executing op: FileCopy(SourceName=C:\Config.Msi\1bc1cc05.rbf,,DestName=C:\Users\user1\AppData\Local\Programs\TestManufacturer\TestApp 1.0.0\start.vbs,Attributes=40992,FileSize=331,PerTick=0,,VerifyMedia=0,ElevateFlags=1,,,,,,,InstallMode=4194308,,,,,,,) 
MSI (s) (F4:0C) [18:37:49:017]: File: C:\Users\user1\AppData\Local\Programs\TestManufacturer\TestApp 1.0.0\start.vbs; To be installed; Won't patch; No existing file 
... 
MSI (s) (F4:0C) [18:37:49:126]: Executing op: End(Checksum=0,ProgressTotalHDWord=0,ProgressTotalLDWord=0) 
MSI (s) (F4:0C) [18:37:49:126]: Error in rollback skipped. Return: 5 
MSI (s) (F4:0C) [18:37:49:126]: No System Restore sequence number for this installation. 
MSI (s) (F4:0C) [18:37:49:126]: Unlocking Server 
MSI (s) (F4:0C) [18:37:49:173]: Note: 1: 2205 2: 3: Control 
Action ended 18:37:49: INSTALL. Return value 3. 
... 
MSI (s) (F4:0C) [18:37:49:173]: MainEngineThread is returning 1603 
MSI (s) (F4:78) [18:37:49:173]: RESTART MANAGER: Session closed. 
MSI (s) (F4:78) [18:37:49:173]: RESTART MANAGER: Session closed. 
MSI (s) (F4:78) [18:37:49:173]: No System Restore sequence number for this installation. 
MSI (s) (F4:78) [18:37:49:173]: User policy value 'DisableRollback' is 0 
MSI (s) (F4:78) [18:37:49:173]: Machine policy value 'DisableRollback' is 0 
MSI (s) (F4:78) [18:37:49:173]: Incrementing counter to disable shutdown. Counter after increment: 0 
MSI (s) (F4:78) [18:37:49:173]: Note: 1: 1402 2: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\Rollback\Scripts 3: 2 
MSI (s) (F4:78) [18:37:49:173]: Note: 1: 1402 2: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\Rollback\Scripts 3: 2 
MSI (s) (F4:78) [18:37:49:189]: Decrementing counter to disable shutdown. If counter >= 0, shutdown will be denied. Counter after decrement: -1 
MSI (s) (F4:78) [18:37:49:189]: Restoring environment variables 
MSI (s) (F4:78) [18:37:49:189]: Destroying RemoteAPI object. 
MSI (s) (F4:24) [18:37:49:189]: Custom Action Manager thread ending. 
MSI (c) (A8:A4) [18:37:49:189]: Back from server. Return value: 1603 
MSI (c) (A8:A4) [18:37:49:189]: Decrementing counter to disable shutdown. If counter >= 0, shutdown will be denied. Counter after decrement: -1 
MSI (c) (A8:A4) [18:37:49:189]: PROPERTY CHANGE: Deleting SECONDSEQUENCE property. Its current value is '1'. 
Action ended 18:37:49: ExecuteAction. Return value 3. 
Action ended 18:37:49: INSTALL. Return value 3. 
... 
=== Logging stopped: 7/22/2015 18:37:49 === 
MSI (c) (A8:A4) [18:37:49:189]: Note: 1: 1708 
MSI (c) (A8:A4) [18:37:49:189]: Note: 1: 2262 2: Error 3: -2147287038 
MSI (c) (A8:A4) [18:37:49:189]: Note: 1: 2262 2: Error 3: -2147287038 
MSI (c) (A8:A4) [18:37:49:189]: Product: TestApp 2.0.0 -- Installation failed. 

據我瞭解的根源問題是,我不使用「NOT在自定義操作LaunchApplication中安裝並未升級產品代碼「條件。

<Custom Action="LaunchApplication" After="InstallFinalize">NOT Installed AND NOT UPGRADINGPRODUCTCODE</Custom> 

在這種情況下安裝程序在安裝新版本中刪除舊版本,然後試圖從舊版本上運行的自定義操作LaunchApplication,但所有文件都已經刪除。這就是安裝失敗的原因。
我向LaunchApplication添加了條件「NOT Installed AND NOT UPGRADINGPRODUCTCODE」,現在可以對我的應用程序執行主要升級。
但我不確定應該使用哪種條件 - 「未安裝且未升級產品代碼」或「未安裝」。
我需要在首次安裝期間和所有主要升級期間運行自定義操作LaunchApplication。

回答

0

不確定這是一個答案,但有太多的評論。

首先,做好升級具有詳細記錄,msiexec.exe指令用/ L * VX,看看發生了什麼事情,因爲有許多事情沒有意義。

  1. 您的自定義動作InstallFinalize,這意味着它是安裝已完成並提交,因此它不能導致升級失敗後後。

  2. 你RemoveExistingProducts是InstallInitialize之前。這意味着它在InstallInitialize開始的安裝事務之外。它確實需要緊隨InstallInitialize之後才能包含在Transation中,因爲它目前獨立於您的新產品安裝,因此您可以獲得任何刪除失敗或正在運行以及安裝失敗或正在運行的組合,並且您最終可以系統上的一組不確定的產品。沒有,不是,或者其中之一。

  3. 什麼SELFFOUND?我期望一個升級元素來引用它,但沒有一個。一般來說,如果您想阻止安裝具有相同版本的主要升級,您應該查看MajorUpgrade元素並將屬性(如AllowSameVersionUpgrades)設置爲No。如果SELFFOUND旨在防止兩次安裝相同的MSI文件,那麼請不要打擾,因爲Windows不會讓你這樣做。

所以沒有足夠的信息來看看發生了什麼,但CA不能負責。最可能的解釋是第一次升級失敗 - 它刪除舊產品,然後新安裝失敗,並且因爲刪除不在事務處理中,所有您看到的是刪除工作和安裝失敗。當你再次安裝它是一個新的系統,這是主要的區別。檢查日誌!

+0

您能否檢查我的更新?我認爲問題的根本原因在於我沒有在自定義操作LaunchApplication中使用條件「未安裝且未升級產品代碼」。謝謝。 –