wix - .msi文件可以自行安装(大概通过“自定义操作”)吗?

标签 wix windows-installer

我要构造一个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作为文件包含在我的Media/CAB中(鸡肉和鸡蛋方案),因此我认为必须在安装前通过“自定义操作”来完成流程中,将原始MSI即时添加到MSI DB的Media/CAB中,并在File表中添加相应的条目。可以做到吗?如果可以,怎么办?

考虑一个内容分发模型,在该模型中,内容文件只能与App一起分发。内容由最终用户在运行时通过App生成,并打包到一个可分发的EXE中,该EXE既包含App又包含内容。

MyApp的安装程序必须保持MSI,但可以由Bootstrapper EXE执行。安装后的MyApp.exe必须有权同时运行MyApp.msi和EXE,App才能在运行时从基础(空)MyAppBootstrapper.exe(由MSI安装)以及由MSI创建的内容“组装”到MyApp.msi和EXE。最终用户。 EXE的资源MSI必须与用于安装运行时打包的应用程序的MSI相同。

WIX不会与MyApp一起安装。

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

我熟悉(并使用)自定义 Action (通过DTF和其他方式进行托管和非托管)。

最佳答案

像这样向您的wxs添加未压缩的介质:

<Media Id='2'/>

然后使用以下File元素创建一个组件:
<File Source='/path/to/myinstaller.msi' Compressed='no' DiskId='2' />

这将使安装程序在安装介质上与要安装的msi相同的文件夹中查找名为“myinstaller.msi”的文件。上面的源路径应该指向一个虚拟文件,只有在这里才能安抚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>

关于wix - .msi文件可以自行安装(大概通过“自定义操作”)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/88078/

相关文章:

windows-installer - MSIEXEC 静默模式安装

wix - 如何调试用 Javascript 实现的 MSI 自定义操作?

installshield - 将 MSI 安装程序的权限更改为管理员 - 普通用户

WIX Bundle Installer,选择要安装的包

java - 如何构建创建 .exe 而不是 .jar 的 msi 安装程序?

installation - 如何在WiX中至少需要两个可选组件之一?

msbuild - 如何在Wix中引用heat.exe生成的wxs文件中的File元素

installation - 如何确定 Windows Installer 正在执行升级而不是首次安装?

xml - 是否可以使用 XPath 从处理指令 ('define' ) 中提取值?

c# - 动态创建VS Project