wix – 更新时实例转换不正确
我正在使用实例转换在同一台机器上多次安装相同的产品.
启动.msi安装文件时,我在命令行上传递TRANSFORMS =“:X”(以及安装所需的其他几个变量),其中X是要使用的程序的版本. 在Product.wxs文件中,我然后使用InstanceTransforms标记分配一个新的ProductCode,例如: <Property Id="INSTANCEID" Value="Default"/> <InstanceTransforms Property="INSTANCEID"> <Instance Id="I1" ProductCode="$(guid.NewGuid())"/> <Instance Id="I2" ProductCode="$(guid.NewGuid())"/> <Instance Id="I4" ProductCode="$(guid.NewGuid())"/> <Instance Id="I3" ProductCode="$(guid.NewGuid())"/> <Instance Id="I5" ProductCode="$(guid.NewGuid())"/> <Instance Id="I6" ProductCode="$(guid.NewGuid())"/> <Instance Id="I7" ProductCode="$(guid.NewGuid())"/> <Instance Id="I8" ProductCode="$(guid.NewGuid())"/> <Instance Id="I9" ProductCode="$(guid.NewGuid())"/> </InstanceTransforms> 此外,UpgradeCode在自定义操作中添加到UpgradeTable,相关代码为: Database db = session.Database; session.Log("Get DB: {0}",db.FilePath ?? string.Empty); string sqlInsertSring = db.Tables["Upgrade"].SqlInsertString + " TEMPORARY"; session.Log("DB Tables,querying with SQL: {0}",sqlInsertSring); View view = db.OpenView(sqlInsertSring); session.Log("OpenView,adding two new records to the UpgradeView."); session.Log("Inserting line: {0},null,{1},512,"UPDATE"",session["UpgradeCode"],session["ProductVersion"]); view.Execute(new Record(new object[] { session["UpgradeCode"],session["ProductVersion"],"UPDATE"})); session.Log("Inserting line: {0},"NEWERVERSIONINSTALLED"","NEWERVERSIONINSTALLED" })); view.Close(); 好的,到目前为止一切顺利,这适用于安装,允许我成功安装同一程序的两个实例.但是,更新似乎不起作用.我可以升级其中一个实例,但在升级第二个实例时,转换无法正常工作,另一个实例再次升级. 示例:两个实例(I1和I2).升级I2工作正常.但是,当我随后尝试更新I1时,它只是再次更新I2(尽管传递了正确的转换). MSI的日志显示转换首先恢复为I1(应该如此),然后再次设置为I2(由于我无法理解的原因): - MSI (s) (B0:F8) [09:06:48:745]: Running product '{C33371A0-C32A-4120-BD8F-ACDC79E13458}' with elevated privileges: Product is assigned. - MSI (s) (B0:F8) [09:06:48:776]: PROPERTY CHANGE: Modifying TRANSFORMS property. Its current value is ':I2'. Its new value: ':I1'. - MSI (s) (B0:F8) [09:06:48:823]: PROPERTY CHANGE: Adding DATADIR property. Its value is MSI (s) (B0:F8) [09:06:49:463]: PROPERTY CHANGE: Adding CURRENTDIRECTORY property. Its value is 'C:UsersAdministratorDesktop'. - [Further arguments passed] - MSI (s) (B0:F8) [09:06:49:494]: PROPERTY CHANGE: Adding CLIENTUILEVEL property. Its value is '2'. - MSI (s) (B0:F8) [09:06:49:572]: PROPERTY CHANGE: Adding CLIENTPROCESSID property. Its value is '6424'. - MSI (s) (B0:F8) [09:06:49:587]: Machine policy value 'DisableAutomaticApplicationShutdown' is 0 - MSI (s) (B0:F8) [09:06:49:634]: RESTART MANAGER: Disabled by MSIRESTARTMANAGERCONTROL property; Windows Installer will use the built-in FilesInUse functionality. - MSI (s) (B0:F8) [09:06:49:681]: PROPERTY CHANGE: Adding MsiSystemRebootPending property. Its value is '1'. - MSI (s) (B0:F8) [09:06:49:728]: PROPERTY CHANGE: Modifying TRANSFORMS property. Its current value is ':I1'. Its new value: ':I2'. - MSI (s) (B0:F8) [09:06:49:821]: TRANSFORMS property is now: :I2 最后一行很重要:TRANSFORMS属性再次设置为I2,这意味着安装将更新实例I2而不是实例I1. 为什么会发生这种情况? TRANSFORMS正确传递,我无法理解为什么该属性会再次被撤回. (如果需要更多代码或表达,我很乐意提供). 编辑:BTW我正在使用WiX工具集3.7. 编辑2:对于安装,我用以下参数调用.msi: MSINEWINSTANCE=1 TRANSFORMS=":I[N]" [Further parameters] (where N is the Instance) 对于更新,我在没有MSINEWINSTANCE的情况下调用.msi,直接从TRANSFORMS部分开始 作为一个脏修复,我现在正在卸载/安装更新,这不是我的计划. 解决方法
你没有提到
MSINEWINSTANCE property所以也许你没有正确地调用安装.此属性应设置为1.有关详细信息,请参阅:
Installing Multiple Instances with Instance Transforms.
我也在我的博客上解释了这个过程:(哇,真的是8年前吗?) Multiple Instance MSI’s and InstallShield 12 更新: 我能够使用WiX和IsWiX正确实现这一点. 步骤1:使用IsWiX多项目解决方案加速器模板创建MSI / MSM项目. 步骤2:将文件添加到合并模块,以便安装程序具有一个文件作为要安装的密钥路径的组件. (这是必需的,因为a)您需要注册至少一个组件才能考虑安装功能/产品; b)具有非文件的密钥路径的组件必须使用不同的guid进行变更,并根据实例ID进行条件安装.要解决这个问题并将其设为简单,只需创建一个以文件作为键路径的组件即可 步骤3:将以下XML添加到主wxs文件Product.wxs: <SetProperty Id="INSTALLLOCATION" Value="[ProgramFilesFolder][Manufacturer][ProductName]" Before="AppSearch" Sequence="first">Not INSTALLLOCATION and Not Installed</SetProperty> <Property Id="InstanceId" Value="0"/> <InstanceTransforms Property="InstanceId"> <Instance Id="I1" ProductCode="*" UpgradeCode="{10E90C30-F117-4EE8-A084-25E4D0076CE4}" ProductName="ProductName-1" /> <Instance Id="I2" ProductCode="*" UpgradeCode="{919F5399-4E7A-4D8A-9484-A85D0F5E2C77}" ProductName="ProductName-2" /> <Instance Id="I3" ProductCode="*" UpgradeCode="{0BEAEF92-1821-4909-A83A-9B2AE2194AAC}" ProductName="ProductName-3" /> </InstanceTransforms> 如果没有在命令行传递一个值并且以前没有安装产品(这种情况下目录是不可变的),那么这段代码会在第一次安装时改变安装目录.我还使用*来获取一个随机的ProductCode并传入一个UpgradeCode值,因为项目模板使用MajorUpgrades开箱即用,每个实例都是一个独特的产品系列,用于升级目的.最后,我将ProductName转换为添加/删除程序中的唯一,并驱动安装位置转换. 安装主实例: msiexec /I ProductName.msi 安装辅助实例: msiexec /I ProductName.msi MSINEWINSTANCE=1 TRANSFORMS=":I1" msiexec /I ProductName.msi MSINEWINSTANCE=1 TRANSFORMS=":I2" msiexec /I ProductName.msi MSINEWINSTANCE=1 TRANSFORMS=":I3" 请注意在TRANSFORMS属性中使用“:”.这指定了Storages表中的嵌入式转换. 这两个安装在“程序文件和程序和功能”中并排显示. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- QT 使用QSetting读取配置文件中的中文乱码解决方案
- windows – 当CPU百分比达到X时如何启动程序
- 逆向工程 – windows中的objdump和Dumpbin有什么区别?
- 在Windows 7 Java 7下破坏了Eclipse CVS extssh
- 如何确定使用(最好)仅批次安装Windows服务?
- windows-server-2008 – 如果在任务调度程序中禁用Windows任
- 是什么让Microsoft-Word生成的HTML文档代码如此之大?
- Windows server 2008 r2企业版安装步骤
- windows – 批处理脚本 – 一个接一个地运行exe程序
- windows-7 – Windows 7 Print Spooler服务不断停止
- windows-server-2012 – 由于磁盘空间不足而禁用
- Windows – VS Express 2013错误DEP1700:配方文
- windows – Docker工具箱 – Localhost无法正常工
- Pacman常用命令
- winapi – 如何在win32编辑控件中使用“占位符文
- windows – 启动进程时“print”和“printo”动词
- windows-server-2008 – 没有telnet客户端的Wind
- windows – 使用ShellExecuteEx启动外部应用程序
- windows – 如何以管理员模式运行应用程序?
- active-directory – 你可以将域功能级别提升到W