2

我们正在为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。

回答

2

我在http://www.codeproject.com/Articles/37825/WIX-SSRS-Custom-Assembly-Installer找到的文章是使这项工作最大的帮助。

看起来我缺少的步骤是在升级和安装时设置MSINEWINSTANCE = 1。

代码项目示例使用自定义操作来确定已安装的实例,并使用结果填充自定义MSI表,以及使用实例填充ListBox。这还带来了额外的好处,即不需要使用RegSearch元素的大量公共属性来查找已安装的实例。

当Select Instance对话框的Next按钮被按下时,第二个自定义动作被调用。这将TRANSFORMS,Installed,MSINEWINSTANCE,NEWPRODUCTFOUND,UPGRADEFOUND和MIGRATE设置为适当的值。它重复了FindInstalledProducts的一些功能。该键值:

新实例:

session["TRANSFORMS"] = string.Format(":{0}", nextAvailableInstance); 
session["Installed"] = "";         
session["MSINEWINSTANCE"] = "1"; 
session["NEWERPRODUCTFOUND"] = ""; 
session["UPGRADEFOUND"] = instance.ProductCode; 
session["MIGRATE"] = instance.ProductCode; 

相同的版本(维护):

session["TRANSFORMS"] = string.Format(":{0}", selectedInstance); 
session["Installed"] = "1"; 
session["NEWERPRODUCTFOUND"] = ""; 
session["UPGRADEFOUND"] = ""; 
session["MIGRATE"] = ""; 
已经安装

较新的版本:(应给予降级错误)

session["TRANSFORMS"] = string.Format(":{0}", selectedInstance); 
session["Installed"] = "1"; 
session["NEWERPRODUCTFOUND"] = instance.ProductCode; 
session["UPGRADEFOUND"] = ""; 
session["MIGRATE"] = ""; 

旧版本安装:(升级)

session["Installed"] = ""; 
session["MSINEWINSTANCE"] = "1"; 
session["NEWERPRODUCTFOUND"] = ""; 
session["UPGRADEFOUND"] = instance.ProductCode; 
session["MIGRATE"] = instance.ProductCode; 

代码项目示例显示Select Instance Dialog为弹出窗口,在Prepare序列中,因此它在FindRelatedProducts和AppSearch之前运行。也可以通过从MaintenanceTypeDlg中按下Back来显示。然而,在尝试将其插入到其他对话框的序列中时,这存在问题,所以我将其设置为普通序列对话框,并且仍然有效。

为了正确工作,需要为所有实例设置TRANSFORMS,因此从不安装默认实例。一个虚拟ProductCode需要创建与其他任何ProductCode不同的产品。我使用Wix“*”惯例。我有默认的UpgradeCode与第一个转换后的升级代码相同,但这应该可能不同,甚至可能省略它。

我还发现我需要使用CustomAction和特定实例的UpradeCode来填充UpgradeTable,以避免它尝试删除升级上的所有其他实例。

0

除非您正在禁止ARP,否则每个实例都应该在“添加/删除程序”中获得它自己的条目,并且当您单击更改时,在维护模式下,该实例对于该实例是ProductCode唯一的。

我错过了什么吗?也许你在压制(ARPSYSTEMCOMPONENT)并且你想编写一个为所有实例提供服务的UI。如果是这样,那可以做到,但它会比一些问题更大。

+0

我禁止ARPMODIFY,但我确实在添加/删除程序中获得了每个实例的条目。我可以修复并从那里删除一个实例,没有问题。但是我需要做的是在运行MSI的新版本时选择特定实例以选择性地升级实例。 – Alban 2012-02-23 08:19:25

+0

“运行新版本时”听起来像是在向我运行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

+0

我写了很多年前,最近有一个使用Microsoft.Deployment.WindowsInstaller在C#中编写的工作示例。 C#对我来说很好,因为我只在我的日常工作中使用Server 2008 R2。我不确定在WX 3.6中多重支持Burn的实例服务。 – 2012-02-23 12:14:57

相关问题