- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在使用 WIX 3.6 为 Silverlight/WCF 应用程序创建安装程序。我们需要安装多个实例的能力,例如“现场”、“测试”和“演示”。每个实例必须能够运行不同的版本并独立升级。这允许在升级“Live”之前在“Test”中安装新版本。
我正在使用 InstanceTransforms 机制来切换 ProductCode 和 CustomActions 来切换最多 10 个实例的 UpgradeCode。
我还设法通过自定义 MaintenanceTypeDlg 来创建一个 UI,以允许在不使用命令行的情况下安装新实例。我设置了 MSINEWINSTANCE=1 和 TRANSFORMS=:Instance,其中 Instance 是在 ExecuteInstall 之前无法在注册表中找到的第一个实例。
我还可以通过主升级路径升级默认实例。添加/删除程序上的删除和修复选项也可以正常工作。
我遇到问题的地方在于创建用于从维护对话框中升级、修复或删除特定实例的机制。
我创建了一个 ComboBox,它使用带有所有已安装实例的 ID 和名称的 CustomAction 进行填充,但我找不到一种可靠地将此信息从 InstallUISequence 传递到 InstallExecuteSequence 的方法。
我已尝试指定 TRANSFORMS=:Instance,但服务器 MSI 删除了该属性。我已尝试指定 MSIINSTANCGUID={[SelectedGuid]},但服务器 MSI 提示说这是对该属性的无效使用,因为它不是多实例安装。
我设法使用带有 TRANSFORMS=:InstancetoUpgrade 的命令行获得特定实例的升级安装,并将 UpgradeTable 设置的属性覆盖为正确的实例 ProductCode,但是它缓存了 TRANSFORMS,并且始终应用该转换,如果没有在命令行上指定 TRANSFORMS=。已设置 TransformsSecure 政策,但我们无法在客户网站上更改此政策。
我无法找到 MSI 或 WIX 的任何文档或示例,这些文档或示例显示要在 InstallUISequence 和 InstallExecuteSequence 之间设置的正确属性,以强制服务器升级、修复或删除除默认实例之外的实例启动 UI 的 MSI。
如果有人设法使多实例 MSI 的这个或类似方面工作,请发布 CustomActions、Properties 等的任何示例,或有关如何使它工作的提示。
编辑:
我已经设法通过设置属性获得一个新版本的 MSI 来升级特定实例:UPGRADEFOUND={PreviousInstanceGUID} TRANSFORMS=:Instance;
但是,如果我尝试再次运行 MSI 来升级差异实例,TRANSFORMS 已经设置为我刚刚升级的实例。我的 UI 无法区分是双击 MSI 还是从脚本运行以升级/修复特定实例。在维护模式下运行时,MSI 似乎也忽略了切换到服务器时对 TRANSFORMS 属性的任何更改。我需要一种方法来处理在某些情况下它将处于维护模式和其他升级模式的事实。实际上,当在 UI 中选择不同实例时,我需要能够重新运行 FindRelatedProducts 和 AppSearch。
最佳答案
我在 http://www.codeproject.com/Articles/37825/WIX-SSRS-Custom-Assembly-Installer 找到的文章是让这项工作发挥最大作用的因素。
看起来我缺少的步骤是在升级和安装时设置 MSINEWINSTANCE=1。
代码项目示例使用自定义操作来确定已经安装了哪些实例,并使用结果填充自定义 MSI 表,以及使用实例填充列表框。这样做的额外好处是不需要大量带有 RegSearch 元素的公共(public)属性来查找已安装的实例。
当按下“选择实例”对话框的“下一步”按钮时,将调用第二个自定义操作。这会将 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;
代码项目示例将选择实例对话框显示为弹出窗口,在准备序列中,因此它在 FindRelatedProducts 和 AppSearch 之前运行。也可以通过在 MaintenanceTypeDlg 中按返回来显示。但是,当尝试将其插入其他对话框序列时会出现问题,因此我将其设为普通的序列对话框,但它仍然有效。
为了正常工作,需要为所有实例设置 TRANSFORMS,因此永远不会安装默认实例。为此,需要创建一个不同于任何其他 ProductCode 的虚拟 ProductCode。我使用了 Wix“*”约定。我的默认 UpgradeCode 与第一个转换后的升级代码相同,但这应该可能不同,甚至可以省略它。
我还发现我需要使用带有特定实例的 UpradeCode 的 CustomAction 来填充 UpgradeTable,以避免它试图删除升级中的所有其他实例。
关于user-interface - 如何创建允许在维护模式下运行时卸载特定实例的 MSI UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9398975/
我的安装程序用 WiX 语言编码。它支持主要的升级机制。一个特殊的要求是 相同的 MSI 文件将无法安装两次。 现在是棘手的部分:如果用户安装然后再次尝试安装它(UI 模式),安装程序进入维护模式,一
我能否可靠地从 MySQL 等常规 MSI 包创建合并模块,以将其与我自己的安装合并?WiX 有相应的工具,但我应该从这种翻译中期待什么陷阱?从我自己的包安装其他 MSI 包的替代方法是什么? 最佳答
免责声明:我仍然没有超越最基本的WiX教程,因为每次我试图理解这些概念时,我的头开始旋转。 我一直在阅读Is it feasible/sensible to wrap an InnoSetup ins
是否有可能在不使用 PowerShell 安装的情况下从 MSI 文件中检索 MSI 产品代码?我想将 MSI 文件的产品代码与安装在机器上的 MSI 代码进行比较,以确定该文件是否曾经安装过。 最佳
我的 Wix 项目创建 install.msi 和 cab1.cab。我如何才能将所有内容捆绑到 msi 中?我可能会使用 7-zip SFX 来解决这个问题,但我见过其他应用程序只有一个 msi。
大多数人可能已经注意到,在卸载 MSI 软件包时,Windows 会要求提供原始的 .msi。文件。这是为什么? 我只能看到缺点: 对网络变化没有弹性。 对本地磁盘更改没有弹性。 用户的意料之外。 通
我正在寻找一个 C API,它可以获取 msi 路径并返回产品版本(主要版本和次要版本),而无需安装 API。 谢谢,埃坦 最佳答案 我不会使用开放包 - 这是一个静态数据库,因此 MsiOpenDa
我正在使用 VS 2008 为 c# windows 项目创建一个安装程序。我正在尝试编写一个自定义操作,从存储在文件服务器上的 MSI 文件的源目录(例如\server\fileshare\myap
我正在使用 WiX 编写 MSI 安装程序以启动依赖于 MSI 安装的 DLL 的服务。在 Vista 上,DLL 被添加到 MSI 的 InstallFinalize 中的全局程序集缓存中阶段,所以
我的 MSI 安装程序不会在 XP 上注册 DLL。在 Vista 上,除非我是管理员,否则它不会注册。在 Win7 上,它会随机注册 DLL 或不注册。 在 MSI 不会注册 DLL 后,用户被迫转
这是我第一次尝试使用 Windows Installer 来构建安装程序包(我们的客户不希望使用 Wix,我已经广泛使用它)。目前我有一个按预期构建和工作的 MSI。但是,我需要为我编写的程序所需的
我们已从 InstallShield LE 2010 转移到 WiX。 我们的新 WiX 安装程序能够卸载以前的 WiX msi 软件包,但它不会检测到从 IS msi 安装的以前版本的软件。 我们应
我正在使用 WiX制作 MSI安装程序调用另一个 MSI 安装程序。 我可以在 UILevel=5 (Full UI) 模式下解决这种情况。我的解决方案是将 CustomAction 添加到调用另一个
我在安装程序的 Windows 缓存方面遇到了问题。我正在尝试进行升级,每次 Windows 安装程序启动旧版本的安装程序时。当我进行升级时,它提示读取旧版本的 msi 文件时出现问题(因为它不再位于
MSI 的表 - “FeatureComponents”有两列:“Feature_”和“Component_”。我想要做的是一次更改“Feature_”列中的所有值。 IntPtr hDb = Int
作为持续集成测试的一部分,我们正在使用 msi 安装几个网站。 对于每个构建,我们要卸载旧的 msi 并安装一个新的。 问题是在构建服务器完成最新版本并重建系统后,我们没有旧的 msi。 有没有一种方
我有一个场景,要安装两个 MSI 包和一个 MSI 包。 例如,我们有两个产品要安装,即。 Sample1.MSI 和 Sample2.MSI。我们需要将 Sample2.MSI 包嵌入到 Sampl
我在 c# 中从 msi.dll 调用 get_PrimaryKeys() 函数时遇到问题。我想找出给定 MSI 表中的主键是什么。我使用以下代码: Type installerType = Type
更新:我更改了这个问题的标题以反射(reflect)下面一些答案真正需要的内容。 我希望能够在 Linux 中从 Visual Studio 2010 的 native 部署工具中生成的 MSI 获取
在 Windows 安装程序包 (.) 的 DefaultDir 列中,表示目录应位于其父目录中,没有子目录。 并且冒号 (:) 用于分隔目标和源目录名称。 DefaultDir 列中的单个值(不带冒
我是一名优秀的程序员,十分优秀!