Windows installer 将操作多次添加到Windows Installer序列表

Windows installer 将操作多次添加到Windows Installer序列表,windows-installer,Windows Installer,我很确定这个问题不存在,但如果它存在,我提前道歉,请让我知道 我的公司要求我研究一个新的安装程序框架,我目前正在研究WindowsInstaller4.5(MSI)。它做了我们需要它做的一切,所以我正在研究它的局限性,有一件事我找不到,那就是你是否可以将一个动作,标准的还是自定义的,多次写入序列表。从我所看到的,人们不,但它并没有说你不能 有人有什么想法吗?提前感谢:) 编辑-这对于自定义操作尤其重要,因为我们使用自己的代码编写了许多安装程序包,并且可能需要在我们编写的多个DLL上使用一个自定义

我很确定这个问题不存在,但如果它存在,我提前道歉,请让我知道

我的公司要求我研究一个新的安装程序框架,我目前正在研究WindowsInstaller4.5(MSI)。它做了我们需要它做的一切,所以我正在研究它的局限性,有一件事我找不到,那就是你是否可以将一个动作,标准的还是自定义的,多次写入序列表。从我所看到的,人们,但它并没有说你不能

有人有什么想法吗?提前感谢:)

编辑-这对于自定义操作尤其重要,因为我们使用自己的代码编写了许多安装程序包,并且可能需要在我们编写的多个DLL上使用一个自定义操作。此外,我们希望框架不会强制我们按特定顺序执行安装步骤(在完美世界中,这是任意的),如果我们可以在序列表中多次使用一个操作,也可以这样做。

根据MSDN:

InstallExecuteSequence表包含以下列

ColumnType键可为空

动作标识符Y N

条件

序列整数ny

主键处于活动状态,因此只能列出一次


可能有一些方法可以使用MsiDoAction在多个地方动态地安排自定义操作,但我从未尝试过。真正的问题是你为什么认为你需要这样做?在编写MSI的10年中,我从来没有需要过。

对于自定义操作,最好的选择是设计一个表驱动的自定义操作,就像Windows Installer的标准表一样。在该设计中,一个即时自定义操作被安排在相对于所有其他操作的适当时间。例如,
在='RemoveFiles'之前
或='InstallFiles'之后(或其他任何内容)

即时自定义操作从一个或多个向操作提供数据的自定义表中读取行。多行允许操作“多次”运行通过读取更多数据。如果您需要修改计算机状态,则立即自定义操作将使用相应的
CustomActionData
计划一个或多个延迟自定义操作。在这种情况下,延迟自定义操作将在您计划时执行。您可以使用::MsiDoAction()计划自定义操作但是我更喜欢使用WiX工具集的wcautil.lib提供的WcaDoAction()


此设计在MSI SDK中记录了有关延迟自定义操作的信息,并将此模式用于其所有自定义操作。它非常强大,在考虑修复、修补和卸载等其他场景时效果非常好。

为什么需要此功能?请参见上文,Jason…或其他可能提出相同问题的人:)见罗伯斯的回答。自定义表表示要做什么,自定义操作表示如何做。通过这种方式,它是松散耦合和高度可重用的。这就是使用Windows Installer的全部要点,更多的是测试安装程序的限制。正如我在问题中所解释的,我的公司正试图找到一个新的安装程序框架,它在所有事情都必须完成的顺序上限制更少。如果你能安排和采取不止一次的行动,理论上这些限制可能会消失。这将是一个很好的2小时啤酒对话。别误会我。。我喜欢,有时也讨厌Windows Installer。但这是最好的。这就是说,它是一个严格的声明性框架,通常需要在行内着色。当你真的,真的理解了它,你就学会了颠覆它的方法。但通常情况下,最好不要与之抗争,因为事情通常会以你无法想象的方式结束,因为你不知道你不知道的。FWIW,我将执行序列表描述为“拆毁房屋并将其重建”模式。当你盖房子的时候,事情通常必须按一定的顺序进行。第一等级,公用事业,基础粗糙,浇注混凝土,框架,屋顶,门窗,壁板,然后等等。对于安装,它是相同的。创建文件夹、复制文件、应用注册表、创建服务、启动服务、创建快捷方式等。在卸载过程中,您可以反转此过程。在升级过程中,您首先要颠倒过程,然后将其向前推进。正如您不想在地毯铺好后拆下屋顶一样,您通常也不想在安装过程中重复任何步骤。在对该主题进行更多研究之后,我应该问您一个问题,Rob。msi序列表是否必须包含标准操作?否。您将无法获得标准行为(并且可能无法依赖于某些标准行为),但序列可以运行任意操作。感谢您的快速响应:)