如何使用 WIX 使用单个 MSI 包安装两个 MSI 包?

Posted

技术标签:

【中文标题】如何使用 WIX 使用单个 MSI 包安装两个 MSI 包?【英文标题】:How to install two MSI packages with single MSI package using WIX? 【发布时间】:2013-03-26 01:40:13 【问题描述】:

我有一个场景是用一个 MSI 包安装两个 MSI 包。

例如,我们有两个产品要安装,即。 Sample1.MSI 和 Sample2.MSI。 我们需要将 Sample2.MSI 包嵌入到 Sample1.MSI 中。 如果我们安装 Sample1.MSI,它应该同时安装 Sample1.MSI 和 Sample2.MSI,这应该在添加或删除程序 (appwiz.cpl) 中创建两个条目。

经过搜索,我发现了一个使用“EmbeddedChainer”标签的示例应用程序,该应用程序在安装时可以正常工作。但它没有正确卸载。

    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLLOCATION" Name="SampleSetup">

      <Component Id="InstallMSIComponent" Guid="7091DE57-7BE3-4b0d-95D5-07EEF6463B62">
        <File Id="ChainRunner.exe" Name="ChainRunner.exe"
              Source="C:\ChainRunner.exe"
              DiskId="1" KeyPath="yes"/>
        <File Id="TestFile.txt" Name="TestFile.txt" Source="TestFile.txt" />
        <File Id="Microsoft.Deployment.WindowsInstaller.dll" Name="Microsoft.Deployment.WindowsInstaller.dll" Source="C:\Microsoft.Deployment.WindowsInstaller.dll"/>
        <File Id="Microsoft.Deployment.WindowsInstaller.xml" Name="Microsoft.Deployment.WindowsInstaller.xml" Source="C:\Microsoft.Deployment.WindowsInstaller.xml"/>          
        <RemoveFolder Id='INSTALLLOCATION' On='uninstall' />
      </Component>

      <Component Id="SampleSetup2Component" Guid="CB568AA4-9790-4efd-91BB-82682F063321">
        <File Id="SampleSetup2.msi" Name="SampleSetup2.msi"
              Source="SampleSetup2.msi"
              DiskId="1" KeyPath="yes"/>      
      </Component>
            </Directory>
        </Directory>
    </Directory>
<EmbeddedChainer Id="Chainer" FileSource="ChainRunner.exe"/>

    <Feature Id="ProductFeature" Title="SampleSetup" Level="1">

  <ComponentRef Id="InstallMSIComponent"/>
  <ComponentRef Id="SampleSetup2Component"/>

        <ComponentGroupRef Id="Product.Generated" />
    </Feature>

ChainRunner 代码

public class CustomActions


    static void Main(string[] args)
    

        try
        
            IntPtr ptr = new IntPtr(Convert.ToInt32(args[0], 16));
            ptr = System.Runtime.InteropServices.Marshal.StringToCoTaskMemAuto(args[0]);
            Transaction transaction = Transaction.FromHandle(ptr, true);
            transaction.Join(TransactionAttributes.JoinExistingEmbeddedUI);

            Installer.InstallProduct(@"C:\SampleSetup2.msi", "");
            transaction.Commit();
            transaction.Close();
        
        catch (Exception e)
        

            Console.WriteLine("Exception in Installation:"+e.Message+"\n"+e.StackTrace.ToString());
            Console.ReadKey();
            throw e;
        
    
    [CustomAction]
    public static ActionResult CustomAction1(Session session)
    
        session.Log("Begin CustomAction1");

        return ActionResult.Success;
    

这哪里搞砸了?

除了这种方法还有其他最好的方法吗?

【问题讨论】:

【参考方案1】:

您可以使用 Wix Burn 创建包含多个应用程序安装程序的安装包:

Wix Toolset: Building Installation Package Bundles; Neil Sleightholm's Blog: WiX Burn – tips/tricks。

【讨论】:

以上是关于如何使用 WIX 使用单个 MSI 包安装两个 MSI 包?的主要内容,如果未能解决你的问题,请参考以下文章

Wix 安装程序包产生损坏的“msi”

如何强制 WiX 引导程序下载 MSI 包?

WiX 3.8:使用相同注册表值的两个MSI。如果同时卸载两个MSI,如何删除注册表值?

如何使用 WiX 和 MSI 进行静默安装和卸载?

回滚到以前版本的 WiX 捆绑安装程序

如何使用 WiX 从源代码重建完全相同的 msi 文件?