首页 / 知识
关于wix:.msi文件可以自行安装(大概通过自定义操作)吗?
2023-04-16 21:06:00

Can a .msi file install itself (presumably via a Custom Action)?我要构造一个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服务进行打包-必须在本地完成)。 我熟悉(并使用)自定义动作(通过DTF和其他方式进行托管和非托管)。 像这样向您的wxs添加未压缩的介质:
然后使用以下File元素创建一个组件:
这将使安装程序在安装介质上与要安装的msi相同的文件夹中查找名为" myinstaller.msi"的文件。上面的源路径应该指向一个虚拟文件,只有在这里才能安抚wix。 编辑:以下示例test.wxs演示了它的工作原理。它生成一个test.msi文件,该文件将自身安装到c: program files test。请注意,您需要将一个虚拟的test.msi文件放置在与text.wxs相同的文件夹中,以安抚wix。
让一个.MSI程序包从自身内部启动另一个.MSI程序包称为嵌套安装,这很不好(请参阅规则20)。 Windows Installer具有一些用于管理当前安装的全局数据,并且不能很好地同时处理多个安装。出于同样的原因,如果您先启动一个安装,然后在仍在进行首次安装时尝试启动另一个安装,通常会弹出一个弹出窗口,显示"正在进行另一次安装,请等待完成"。
您可以拥有一个程序,通常称为引导程序(我想这就是您所指的),它本身不是安装程序包,但包含作为资源的安装程序包(如.MSI或.EXE),可能被压缩。引导程序的作用是将资源提取/扩展到文件(通常位于 WiX本身未安装,否。这是一个可以构建.MSI软件包的工具。 WiX项目在其愿望清单上有一个通用的引导程序,但尚未实现。还有其他自举程序,例如这个。 您不需要进行自定义操作-实际上,由于引导程序本身并不是Windows Installer安装包,因此"自定义操作"对其没有任何意义。而且,如果您对CA足够熟悉,可以了解托管/非托管/ DTF,那么您就会足够了解,可以避免自定义操作。 (笑) 我认为引导程序将MSI文件提取到某个预定义位置而不是temp文件夹要容易得多。例如,到C: Documents and Settings All Users Application Data My Company My Product Install Cache。安装完成后,引导程序会将MSI文件保留在那里。如果在某个阶段用户决定重新安装产品,则Windows Installer将能够找到源MSI文件。 另外,将此文件的路径添加到RemoveFile表中,以便在卸载时将其删除。您可以为此使用WiX中的RemoveFile元素。 因此,如果我理解的话,那么我想让该应用程序创建一个包含内容文件的转换(MST),并将其应用于基本MSI。我仍然不相信我能理解。 :) 我也在研究一种部署多个MSI文件的方法。我有一个bootstrapper.exe程序,该程序捆绑MSI文件并一次运行一个。在大多数情况下,这解决了我的问题。 它不能解决的问题是安装的GPO(全局策略对象)分发。 GPO需要一个dot-msi文件才能运行安装。 为此,这是我几乎可以解决问题的方法(但不是完全解决)。我将dot-msi文件放在安装程序的文件表中,并将引导程序放在二进制表中,并通过在InstallExecuteSequence中的InstallFinalize之后插入的自定义操作来运行它。当然,引导程序将无法运行其他MSI,因为顶级MSI拥有_MSIExecute互斥体。 进一步走很容易。我将引导程序返回控件设置到顶级安装程序并继续。然后,我添加了一个WaitForSingleObject调用,以等待顶级安装完成,然后引导程序可以继续完成安装。 我的问题是GPO安装在引导时发生,并且顶层安装在子安装程序完成和GPO重新引导计算机之前完成。 当稍后安装实际上可能失败时,顶级安装也会返回成功状态。 我仍在寻找一种方法来阻止顶层安装完成,直到引导程序完成为止。 我将MSI缓存路径配置为已知位置。 然后在运行时,如果您需要使用VBScript或类似版本来"编辑" MSI。 但是,我仍然问为什么!?! |
最新内容
相关内容
更新文件命令linux?
更新文件命令linux?,工作,系统,地址,信息,时间,命令,目录,基础,标准,网络,linux常用命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目linux基础命令增加文件?
linux基础命令增加文件?,系统,时间,名字,文件,基础,数据,命令,名称,首次,密码,linux命令如何新建一个文件终端下键入:touch加文件名,这样就创建linux下读取文件命令?
linux下读取文件命令?,系统,工作,地址,数字,图片,信息,网络,命令,文件,一致,linux文件系统常用命令1、其中一些常用的命令包括ls、cd、pwd和mklinux的nc命令安装?
linux的nc命令安装?,网络,检测,状态,项目,工具,系统,环境,软件,通信,服务,在linux下怎么搭建环境测试traceroute1、首先是准备工作,需要提前获linux操作数据库命令?
linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参数,如何实现MySQL数据库的基本用法在linux下1、mysql all-databaselinux系命令的操作?
linux系命令的操作?,工作,系统,信息,网络,命令,基础,简介,管理,目录,操作,linux的cd命令的使用方法cd ~:回到用户家目录。注:这得看你是用什么用linux文件全选命令?
linux文件全选命令?,电脑,系统,环境,代码,平台,服务,快捷键,文件,命令,权限,linux不小心文件全选点了打开,怎么全部取消打开文件你如果没有修linux浏览文件类命令?
linux浏览文件类命令?,系统,信息,数据,情况,命令,标准,时间,文件,概念,管理,在Linux系统中,执行什么命令查看文件或目录的权限?1、linux查看文linux重名名文件命令?
linux重名名文件命令?,图片,名称,名字,文件,命令,位置,代码,软件,系统,文件名,linux文件重命名命令mv较简单的处理命令:mvmv原文件名新文件名如linux的建立文件命令?
linux的建立文件命令?,名称,系统,时间,名字,命令,文件夹,位置,密码,不了,文件,Linux虚拟机命令如何创建新的文件和文件夹首先,连接相应linux主linux将文件备份命令?
linux将文件备份命令?,系统,密码,设备,软件,通讯,较大,认证,服务,数据,文件,Linux下数据备份命令scp、rsync和后台运行1、scp 是secure copy的linux扩展文件命令?
linux扩展文件命令?,工作,地址,系统,信息,命令,目录,管理,情况,文件,标准,Linux文件系统操作命令1、(1)根据文件名查找例如,我们想要查找一个文