我们正在为Silverlight/WCF应用程序创建一个使用WIX 3.6的安装程序。 我们需要安装多个实例以提供例如“现场”,“测试”和“演示”。 每个实例必须能够运行不同的版本并独立升级。 这允许在升级“Live”之前在“测试”中安装新版本。如何创建允许在维护模式下运行时卸载特定实例的MSI UI
我正在使用InstanceTransforms机制来切换ProductCode和CustomActions以切换最多10个实例的UpgradeCode。
我还设法通过自定义MaintenanceTypeDlg来创建UI,以允许在不使用命令行的情况下安装新实例。我设置了MSINEWINSTANCE = 1和TRANSFORMS =:实例,其中Instance是在ExecuteInstall之前无法在注册表中找到的第一个实例。
我也可以通过主要升级路径升级默认实例。 添加/删除程序上的删除和修复选项也可以正常工作。
我遇到问题的地方在于在维护对话框中创建升级,修复或删除特定实例的机制。
我创建了一个ComboBox,它使用CustomAction填充了所有已安装实例的ID和名称,但是我找不到将这些信息可靠地从InstallUISequence传递到InstallExecuteSequence的方法。
我试过指定TRANSFORMS =:Instance,但Server MSI删除了属性。 我试过指定MSIINSTANCEGUID = {[SelectedGuid]},但服务器MSI抱怨说这是该属性的无效使用,因为它不是多实例安装。
我设法使用TRANSFORMS =:InstancetoUpgrade使用命令行工作的特定实例的升级安装,并将UpgradeTable设置的属性覆盖到正确的实例ProductCode,但它缓存TRANSFORMS,并始终应用该转换如果在命令行上没有指定TRANSFORMS =。 已设置TransformsSecure政策,但我们无法在客户网站上更改此政策。
我一直无法找到MSI或WIX的任何文档或示例,它们显示了在InstallUISequence和InstallExecuteSequence之间设置的正确属性,以强制服务器升级,修复或删除默认的实例用户界面启动的MSI。
如果有人设法得到这个或类似的多实例MSI的工作方式,请发布CustomActions,Properties等的任何示例或有关如何使其工作的提示。
编辑:
我已经得到了一个新版本的MSI通过设置属性升级的具体实例: UPGRADEFOUND = {} PreviousInstanceGUID TRANSFORMS =:实例;
但是,如果我尝试再次运行MSI以升级差异实例,TRANSFORMS已设置为我刚升级的那个。 我的UI无法区分MSI被双击或从脚本运行以升级/修复特定实例。 它也看起来像MSI在维护模式下运行时忽略切换到服务器时对TRANSFORMS属性的任何更改。 我需要一种处理这样的事实:对于某些情况,它将处于维护模式和其他升级模式。 实际上,我需要能够在UI中选择差异实例时重新运行FindRelatedProducts和AppSearch。
我禁止ARPMODIFY,但我确实在添加/删除程序中获得了每个实例的条目。我可以修复并从那里删除一个实例,没有问题。但是我需要做的是在运行MSI的新版本时选择特定实例以选择性地升级实例。 – Alban 2012-02-23 08:19:25
“运行新版本时”听起来像是在向我运行MSI。出于某种原因,我认为ARP。查看:http://blog.deploymentengineering.com/2006/10/multiple-instance-msis-and.html和http://blog.deploymentengineering.com/2008/03/installshield-2009-beta-part-i .html – 2012-02-23 12:13:22
我写了很多年前,最近有一个使用Microsoft.Deployment.WindowsInstaller在C#中编写的工作示例。 C#对我来说很好,因为我只在我的日常工作中使用Server 2008 R2。我不确定在WX 3.6中多重支持Burn的实例服务。 – 2012-02-23 12:14:57