Wix .msi文件是否可以自行安装(可能通过自定义操作)?

Wix .msi文件是否可以自行安装(可能通过自定义操作)?,wix,windows-installer,Wix,Windows Installer,我想构造一个MSI,在安装过程中,它将自身及其包含的文件/组件部署到TargetDir 因此,MyApp.msi在其文件表中包含MyApp.exe和MyAppBootstrapperEmpty.exe(没有资源) 用户启动MyAppBootstrapperPackaged.exe(包含MyApp.msi作为资源,从internet某处或电子邮件或其他方式获取)。MyAppBootStrapperPackaged.exe将MyApp.msi提取到临时文件夹,并通过msiexec.exe执行 msi

我想构造一个MSI,在安装过程中,它将自身及其包含的文件/组件部署到TargetDir

因此,MyApp.msi在其文件表中包含MyApp.exe和MyAppBootstrapperEmpty.exe(没有资源)

用户启动MyAppBootstrapperPackaged.exe(包含MyApp.msi作为资源,从internet某处或电子邮件或其他方式获取)。MyAppBootStrapperPackaged.exe将MyApp.msi提取到临时文件夹,并通过msiexec.exe执行

msiexec.exe进程完成后,我希望MyApp.msi、MyBootstrapperEmpty.exe(以及%ProgramFiles%\MyApp文件夹中的MyApp.exe),以便MyApp.exe在运行时可以确保访问MyApp.msi(用于创建下面提到的打包内容)

MyAppBootstrapper*.exe可以尝试将MyApp.msi复制到%ProgramFiles%\MyApp文件夹中,但需要提升才能执行此操作,并且不允许通过Windows Installer卸载过程(从添加/删除程序或其他方式)将其删除,该过程应予以保留

显然(我认为这很明显——我错了吗?)我不能将MSI作为文件包含在我的媒体/CAB中(鸡和蛋场景),因此我认为必须在安装过程之前通过自定义操作完成,将原始MSI添加到MSI DB的媒体/CAB中,并在文件表中动态添加相应的条目。这可以做到吗?如果可以,如何做到

设想一种内容分发模型,其中内容文件只能与应用程序一起分发。内容由最终用户在运行时通过应用程序生成,并打包成可分发的EXE,其中包括应用程序和内容

MyApp的安装程序必须保持为MSI,但可以由引导程序EXE执行。安装的MyApp.EXE必须具有对MyApp.MSI和EXE的访问权限,并且应用程序将在运行时从基(空)进行“组装”MyAppBootstrapper.exe(也由MSI安装)和最终用户创建的内容。该exe的资源MSI必须与用于安装正在进行运行时打包的应用程序的资源MSI相同

WIX不能与MyApp一起安装

在运行/打包时不能有网络依赖项(即不能通过Web服务进行打包-必须在本地进行)


我熟悉(并使用)自定义操作(托管和非托管,通过DTF和其他方式)。

因此,如果我理解,那么我想我会让应用程序创建一个包含内容文件的转换(MST),并将其应用于基本MSI。但我仍然不相信我理解。:)

让一个.MSI包从“内部”启动另一个.MSI包被称为嵌套安装,它是独立的(参见规则20)。Windows Installer有一些用于管理当前安装的全局数据,它不能很好地同时处理多个安装。出于同样的原因,如果您启动一个安装,然后在第一个安装仍在进行时尝试启动另一个安装,您通常会看到一个弹出窗口,其效果是“正在进行另一个安装,请等待安装完成”

您可以有一个程序,通常称为引导程序(我想这就是您所指的),它本身不是安装包,但包含一个安装包(如.MSI或.EXE)作为资源,可能是压缩的。引导程序的操作是将资源提取/扩展到一个文件,通常位于
%TEMP%
目录中,然后启动提取的.EXE或在提取的.MSI上运行MSIEXEC。如果您需要在主软件包之前安装先决条件,引导程序可以包含多个资源并逐个提取和安装它们。或者,您可以将多个软件包作为单独的文件发送,让引导程序直接从分发介质逐个执行/安装它们,或者将它们复制到目标计算机并从那里运行一系列安装,或者

WiX本身没有安装,不。它是一个可以用来构建.MSI包的工具。WiX项目的愿望清单上有一个通用的引导程序,但尚未实现。还有其他可用的引导程序,例如


您不需要自定义操作——事实上,由于引导程序本身不是Windows Installer安装包,“自定义操作”对它没有任何意义。而且,如果您对CAs足够熟悉,了解托管/非托管/DTF,那么您就可以尽可能避免自定义操作。(咧嘴笑)

我认为引导程序更容易将MSI文件提取到某个预定义的位置,而不是临时文件夹。例如,到C:\Documents and Settings\All Users\Application Data\My Company\My Product Install Cache。安装完成后,引导程序会将MSI文件留在那里。如果在某个阶段用户决定重新安装产品,Windows Installer将能够找到源MSI文件


另外,将此文件的路径添加到,以便在卸载时将其删除。您可以在WiX中使用。

我会将MSI缓存路径配置为已知位置

然后在运行时,如果需要“编辑”MSI,请使用VBScript或类似工具


但我还是问为什么

向WX添加未压缩介质,如下所示:

<Media Id='2'/>
<File Source='/path/to/myinstaller.msi' Compressed='no' DiskId='2' />

然后创建一个具有文件元素的组件,如下所示:

<Media Id='2'/>
<File Source='/path/to/myinstaller.msi' Compressed='no' DiskId='2' />

这将使安装程序在安装介质上查找名为“myinstaller.msi”的文件,该文件与正在安装的msi位于同一文件夹中。上面的源路径应该指向一个伪文件,它只是为了安抚wix

<?xml version='1.0' encoding='utf-8'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product
         Name='ProductName'
         Id='*'
         Language='1033'
         Version='0.0.1'
         Manufacturer='ManufacturerName' >
      <Package
            Keywords='Installer'
            Description='Installer which installs itself'
            Manufacturer='ManufactererName'
            InstallerVersion='100'
            Languages='1033'
            Compressed='yes'
            SummaryCodepage='1252'/>

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

      <Directory Id='TARGETDIR' Name="SourceDir">
         <Directory Id='ProgramFilesFolder'>
            <Directory Id='TestFolder' Name='Test' >
               <Component Id="InstallMyself">
                  <File Source="./test.msi" Compressed="no" DiskId="2" />
               </Component>
            </Directory>
         </Directory>
      </Directory>

      <Feature
            Id='Complete'
            Display='expand'
            Level='1'
            Title='Copy msi file to program files folder'
            Description='Test'>

         <ComponentRef Id="InstallMyself" />
      </Feature>

   </Product>
</Wix>
编辑:以下示例test.wxs演示了它的工作原理。它生成一个test.msi文件,该文件将自身安装到c:\program files\test。请注意,您需要将一个虚拟test.msi文件放在与text.wxs相同的文件夹中,以安抚wix

<?xml version='1.0' encoding='utf-8'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product
         Name='ProductName'
         Id='*'
         Language='1033'
         Version='0.0.1'
         Manufacturer='ManufacturerName' >
      <Package
            Keywords='Installer'
            Description='Installer which installs itself'
            Manufacturer='ManufactererName'
            InstallerVersion='100'
            Languages='1033'
            Compressed='yes'
            SummaryCodepage='1252'/>

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

      <Directory Id='TARGETDIR' Name="SourceDir">
         <Directory Id='ProgramFilesFolder'>
            <Directory Id='TestFolder' Name='Test' >
               <Component Id="InstallMyself">
                  <File Source="./test.msi" Compressed="no" DiskId="2" />
               </Component>
            </Directory>
         </Directory>
      </Directory>

      <Feature
            Id='Complete'
            Display='expand'
            Level='1'
            Title='Copy msi file to program files folder'
            Description='Test'>

         <ComponentRef Id="InstallMyself" />
      </Feature>

   </Product>
</Wix>