WIX - 是否可以为多个MSI创建语言中性补丁?

时间:2011-08-09 18:48:25

标签: wix windows-installer patch

我们有不同语言的多个MSI,因此每个MSI都有自己的ProductCode和UpgradeCode。使用英语MSI,我们在http://blogs.msdn.com/astebner/archive/2007/10/26/5700191.aspx中使用Aaron的方法创建了一个补丁,例如蜡烛/灯/火炬/火焰 使用以下Patch.wxs:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Patch 
        AllowRemoval="yes" 
        Manufacturer="xxx" 
        MoreInfoURL="xxx" 
        DisplayName="MyProduct First Patch" 
        Description="My Product First Patch" 
        Classification="Update Rollup" 
   >
      <Media Id="5000" Cabinet="RTM.cab" >
         <PatchBaseline Id="RTM"/>
      </Media>
      <PatchFamilyRef Id="PatchFamilyRollup"/>
   </Patch>
   <Fragment>    
      <PatchFamily Id='PatchFamilyRollup' Version='1.1.1.1' Supersede='yes'>
... 

但是,当我们在安装了非英语MSI的计算机上应用此修补程序时,会出现以下错误: “Windows Installer服务无法安装升级修补程序,因为要升级的程序可能会丢失,或者升级修补程序可能会更新程序的其他版本。请验证您的计算机上是否存在要升级的程序并且您具有正确的升级补丁。“

所以我的问题是, 是否可以创建可用于任何语言的补丁(MSP)? 如果是这样,需要做什么?

2 个答案:

答案 0 :(得分:1)

我认为你应该试验Validate元素,它是PatchBaseline的子元素,以及torch.exe命令行的验证标志。正确的位组合将允许您安装补丁。

答案 1 :(得分:1)

谢谢严给我一个正确的方向。我用“验证”元素和“火炬”命令玩了几个小时,但我得到了同样的错误。然后我的同事向我展示了“TargetProductCode”元素。经过几次试验后,我终于完成了它的工作,尽管解决方案不仅仅是语言中立的。我找到的答案是“Validate”元素和“TargetProductCode”元素的组合。我发布了自己的答案,以便有人可以从中获益。

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Patch 
        AllowRemoval="yes" 
        Manufacturer="xxx" 
        MoreInfoURL="xxx" 
        DisplayName="MyProduct First Patch" 
        Description="My Product First Patch" 
        Classification="Update Rollup" 
   >
      <Media Id="5000" Cabinet="RTM.cab">
         <PatchBaseline Id="RTM" >
            <Validate ProductId='no' ProductLanguage='no' ProductVersionOperator='LesserOrEqual' UpgradeCode='no' />
         </PatchBaseline>
      </Media>

      <TargetProductCodes Replace='yes'>
         <!-- list all language specific ProductCode here. -->
         <TargetProductCode Id='{xxxxx}' /> <!-- ProductCode for English -->
         <TargetProductCode Id='{yyyyy}' /> <!-- ProductCode for French -->
      </TargetProductCodes>

      <PatchFamilyRef Id="PatchFamilyRollup"/>
   </Patch>
...