- 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/
前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理
所以我用 Create React App 创建并设置了一个大型 React 应用程序。最近我们开始使用 Storybook 来处理和创建组件。它很棒。但是,当我们尝试运行或构建应用程序时,我们不断遇
遵循我正在创建的控件的代码片段。这个控件用在不同的地方,变量也不同。 我正在尝试编写指令来清理代码,但在 {{}} 附近插入值时出现解析错误。 刚接触 Angular ,无法确定我错过了什么。请帮忙。
我正在尝试创建一个 image/jpeg jax-rs 提供程序类,它为我的基于 post rest 的 Web 服务创建一个图像。我无法制定请求来测试以下内容,最简单的测试方法是什么? @POST
我一直在 Windows 10 的模拟器中练习 c。后来我改用dev C++ IDE。当我在 C 中使用 FILE 时。创建的文件的名称为 test.txt ,而我给出了其他名称。请帮助解决它。 下面
当我们创建自定义 View 时,我们将 View 文件的所有者设置为自定义类,并使用 initWithFrame 或 initWithCode 对其进行实例化。 当我们创建 customUITable
我正在尝试为函数 * Producer 创建一个线程,但用于创建线程的行显示错误。我为这句话加了星标,但我无法弄清楚它出了什么问题...... #include #include #include
今天在做项目时,遇到了需要创建JavaScript对象的情况。所以Bing了一篇老外写的关于3种创建JavaScript对象的文章,看后跟着打了一遍代码。感觉方法挺好的,在这里与大家分享一下。 &
我正在阅读将查询字符串传递给 Amazon 的 S3 以进行身份验证的文档,但似乎无法理解 StringToSign 的创建和使用方式。我正在寻找一个具体示例来说明 (1) 如何构造 String
前言:我对 C# 中任务的底层实现不太了解,只了解它们的用法。为我在下面屠宰的任何东西道歉: 对于“我怎样才能开始一项任务但不等待它?”这个问题,我找不到一个好的答案。在 C# 中。更具体地说,即使任
我有一个由一些复杂的表达式生成的 ILookup。假设这是按姓氏查找人。 (在我们简单的世界模型中,姓氏在家庭中是唯一的) ILookup families; 现在我有两个对如何构建感兴趣的查询。 首
我试图创建一个 MSI,其中包含 和 exe。在 WIX 中使用了捆绑选项。这样做时出错。有人可以帮我解决这个问题。下面是代码: 错误 error LGH
在 Yii 中,Create 和 Update 通常使用相同的形式。因此,如果我在创建期间有电子邮件、密码、...other_fields...等字段,但我不想在更新期间专门显示电子邮件和密码字段,但
上周我一直在努力创建一个给定一行和一列的 QModelIndex。 或者,我会满足于在已经存在的 QModelIndex 中更改 row() 的值。 任何帮助,将不胜感激。 编辑: QModelInd
出于某种原因,这不起作用: const char * str_reset_command = "\r\nReset"; const char * str_config_command = "\r\nC
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
在今天之前,我使用/etc/vim/vimrc来配置我的vim设置。今天,我想到了创建.vimrc文件。所以,我用 touch .vimrc cat /etc/vim/vimrc > .vimrc 所
我可以创建一个 MKAnnotation,还是只读的?我有坐标,但我发现使用 setCooperative 手动创建 MKAnnotation 并不容易。 想法? 最佳答案 MKAnnotation
在以下代码中,第一个日志语句按预期显示小数,但第二个日志语句记录 NULL。我做错了什么? NSDictionary *entry = [[NSDictionary alloc] initWithOb
我正在使用与此类似的代码动态添加到数组; $arrayF[$f+1][$y][$x+1] = $value+1; 但是我在错误报告中收到了这个: undefined offset :1 问题:尝试创
我是一名优秀的程序员,十分优秀!