2008-09-11 114 views
28

如何将使用WiX安装的安装集(MSI)重新升级到与原始安装相同的文件夹?将WiX安装集升级到相同的文件夹

作为升级正确检测到安装,但目录选择屏幕仍然显示并且具有默认值(不一定是当前安装文件夹)。

在首次安装时,我是否必须手动完成安装文件夹保存在注册表项中,然后在升级时读取此密钥?如果是这样,有没有例子?

还是有一些更简单的方法来实现MSI或WiX?

作为参考,我在我目前的WiX文件如下:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi"> 
    <Product Id="a2298d1d-ba60-4c4d-92e3-a77413f54a53" 
      Name="MyCompany Integration Framework 1.0.0" 
      Language="1033" 
      Version="1.0.0" 
      Manufacturer="MyCompany" 
      UpgradeCode="9071eacc-9b5a-48e3-bb90-8064d2b2c45d"> 

     <!-- Package information --> 
     <Package Keywords="Installer" 
       Id="e85e6190-1cd4-49f5-8924-9da5fcb8aee8" 
       Description="Installs MyCompany Integration Framework 1.0.0" 
       Comments="Installs MyCompany Integration Framework 1.0.0" 
       InstallerVersion="100" 
       Compressed="yes" /> 

     <Upgrade Id='9071eacc-9b5a-48e3-bb90-8064d2b2c45d'> 
      <UpgradeVersion Property="PATCHFOUND" 
          OnlyDetect="no" 
          Minimum="0.0.1" 
          IncludeMinimum="yes" 
          Maximum="1.0.0" 
          IncludeMaximum="yes"/> 
     </Upgrade> 

     <!-- Useless but necessary... --> 
     <Media Id="1" Cabinet="MyCompany.cab" EmbedCab="yes" /> 

     <!-- Precondition: .NET 2 must be installed --> 
     <Condition Message='This setup requires the .NET Framework 2 or higher.'> 
      <![CDATA[MsiNetAssemblySupport >= "2.0.50727"]]> 
     </Condition> 

     <Directory Id="TARGETDIR" 
        Name="SourceDir"> 
      <Directory Id="MyCompany" 
         Name="MyCompany"> 
       <Directory Id="INSTALLDIR" 
          Name="Integrat" 
          LongName="MyCompany Integration Framework"> 
        <Component Id="MyCompanyDllComponent" 
           Guid="4f362043-03a0-472d-a84f-896522ce7d2b" 
           DiskId="1"> 
         <File Id="MyCompanyIntegrationDll" 
           Name="IbIntegr.dll" 
           src="..\Build\MyCompany.Integration.dll" 
           Vital="yes" 
           LongName="MyCompany.Integration.dll" /> 
         <File Id="MyCompanyServiceModelDll" 
           Name="IbSerMod.dll" 
           src="..\Build\MyCompany.ServiceModel.dll" 
           Vital="yes" 
           LongName="MyCompany.ServiceModel.dll" /> 
        </Component> 

        <!-- More components --> 
       </Directory> 
      </Directory> 
     </Directory> 

     <Feature Id="MyCompanyProductFeature" 
       Title='MyCompany Integration Framework' 
       Description='The complete package' 
       Display='expand' 
       Level="1" 
       InstallDefault='local' 
       ConfigurableDirectory="INSTALLDIR"> 
      <ComponentRef Id="MyCompanyDllComponent" /> 
     </Feature> 

     <!-- Task scheduler application. It has to be used as a property --> 
     <Property Id="finaltaskexe" 
        Value="MyCompany.Integration.Host.exe" /> 
     <Property Id="WIXUI_INSTALLDIR" 
        Value="INSTALLDIR" /> 

     <InstallExecuteSequence> 
      <!-- command must be executed: MyCompany.Integration.Host.exe /INITIALCONFIG parameters.xml --> 
      <Custom Action='PropertyAssign' 
        After='InstallFinalize'>NOT Installed AND NOT PATCHFOUND</Custom> 
      <Custom Action='LaunchFile' 
        After='InstallFinalize'>NOT Installed AND NOT PATCHFOUND</Custom> 

      <RemoveExistingProducts Before='CostInitialize' /> 
     </InstallExecuteSequence> 

     <!-- execute comand --> 
     <CustomAction Id='PropertyAssign' 
         Property='PathProperty' 
      Value='[INSTALLDIR][finaltaskexe]' /> 
     <CustomAction Id='LaunchFile' 
         Property='PathProperty' 
         ExeCommand='/INITIALCONFIG "[INSTALLDIR]parameters.xml"' 
         Return='asyncNoWait' /> 

     <!-- User interface information --> 
     <UIRef Id="WixUI_InstallDir" /> 
     <UIRef Id="WixUI_ErrorProgressText" /> 
    </Product> 
</Wix> 

回答

31

有一个在WiX的教程中的例子:http://wix.tramontana.co.hu/tutorial/getting-started/where-to-install

<Property Id="INSTALLDIR"> 
    <RegistrySearch Id='AcmeFoobarRegistry' Type='raw' 
    Root='HKLM' Key='Software\Acme\Foobar 1.0' Name='InstallDir' /> 
</Property> 

当然,你必须设置注册表项作为安装的一部分。将其粘贴在原始安装的一部分内:

<RegistryKey 
     Key="Software\Software\Acme\Foobar 1.0" 
     Root="HKLM"> 
    <RegistryValue Id="FoobarRegInstallDir" 
      Type="string" 
      Name="InstallDir" 
      Value="[INSTALLDIR]" /> 
</RegistryKey> 
+0

我已经实现了这一点,它的工作原理。谢了哥们。 – 2008-09-18 14:15:27

+1

指向教程的链接已更改为:http://wix.tramontana.co.hu/tutorial/getting-started/where-to-install – marcin 2011-11-09 12:39:17

5

'Registry'已弃用。现在的代码部分应该是这样的:

<RegistryKey Id="FoobarRegRoot" 
      Action="createAndRemoveOnUninstall" 
      Key="Software\Software\Acme\Foobar 1.0" 
      Root="HKLM"> 
    <RegistryValue Id="FoobarRegInstallDir" 
       Type="string" 
       Name="InstallDir" 
       Value="[INSTALLDIR]" /> 
</RegistryKey> 
4

你并不真正需要的RegistryKey从RegistryValue在一个简单的情况下,这样的分离。此外,使用HKMU而不是HKLM可以处理您是否正在进行机器或用户安装。

<RegistryValue 
    Root="HKMU" 
    Key="Software\[Manufacturer]\[ProductName]" 
    Name="InstallDir" 
    Type="string" 
    Value="[INSTALLDIR]" 
    KeyPath="yes" /> 
相关问题