【问题标题】:Wix Instance Transform Dynamic ProductName and IdWix 实例转换动态产品名称和 ID
【发布时间】:2016-11-24 09:45:18
【问题描述】:

我有一个 Wix wxs 文件,我在其中配置了使用 Instance Transform 的多个实例。

    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <?define WixDemoWPFApp_TargetDir=$(var.WixDemoWPFApp.TargetDir)?>
    <Product Id="*" Name="WixSetupWPFApp" Language="1033" Version="2.0.0.0" Manufacturer="Licence Owner"
       UpgradeCode="ae4af8f5-9287-408a-b7bd-d2fdb89a8da7">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="Downgrade not allowed" />
    <MediaTemplate />

    <Property Id="INSTANCEID" Value="0" />

    <InstanceTransforms Property="INSTANCEID">
    <Instance Id="I01" ProductCode="{888F3620-F2AB-4C0B-A276-0A5AE9C0B6CB}" ProductName="WixDemo 3.7.4 Dev" />
    <Instance Id="I02" ProductCode="{01D23E62-A369-43E1-914A-FA017B1EE822}" ProductName="WixDemo 3.7.4 Test" />
    <Instance Id="I03" ProductCode="{00D804D7-0AD0-412C-805A-4D37FF74FFA3}" ProductName="WixDemo 3.7.5" />
    <Instance Id="I04" ProductCode="{6C3E5B4E-BF7D-4E7E-A62A-B7DFB750F581}" ProductName="WixDemo 3.7.6" />

   </InstanceTransforms>

   <Feature Id="ProductFeature" Title="WixSetupWPFApp" Level="1">
  <ComponentGroupRef Id="ProductComponents" />
  </Feature>
  </Product>

  <Fragment>

 <SetDirectory Id="WINDOWSVOLUME" Value="[WindowsVolume]" />
 <Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="WINDOWSVOLUME">
    <Directory Id="WixDemo" Name="WixDemo">
      <Directory Id="INSTALLLOCATION" Name="WixDemo" />
    </Directory>
  </Directory>
 </Directory>

  <Fragment>
  <ComponentGroup Id="ProductComponents" Directory="INSTALLLOCATION">
  <Component Id="WixDemoWPFApp.exe" Guid="42907ee1-2bb2-4416-8d8f-cebc2bf53f09">
    <File Id="WixDemoWPFApp.exe" Name="WixDemoWPFApp.exe" Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.exe" />
  </Component>
  <Component Id="WixDemoWPFApp.exe.config" Guid="ed8a9503-2eb1-4f49-b7f3-f027f542c93f">
    <File Id="WixDemoWPFApp.exe.config" Name="WixDemoWPFApp.exe.config"
          Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.exe.config" />
  </Component>
  <Component Id="WixDemoWPFApp.pdb" Guid="5bf6cd62-7bc7-42cd-839a-7b66d7e8a09a">
    <File Id="WixDemoWPFApp.pdb" Name="WixDemoWPFApp.pdb" Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.pdb" />
  </Component>
  </ComponentGroup>
</Fragment>
</Wix>

我通过执行以下命令进行安装,

msiexec INSTALLLOCATION="D:\Wixtestinstance\1" /i WixSetupWPFApp.msi MSINEWINSTANCE=1 TRANSFORMS=":I01"
  1. 如何在不使用命令的情况下动态生成实例 在 InstanceTransform 内部初始化。
  2. 如果上述方法不可行,可以动态传递 ProductName 通过命令而不对其进行硬编码。

【问题讨论】:

    标签: wix windows-installer wix3.7 wix3.6 instance-transform


    【解决方案1】:

    必须提前创建实例转换。虽然从技术上讲,没有什么可以阻止引导程序在调用 MSI 之前在安装时动态生成转换,但多个实际问题确实阻止了这一点。

    • instance transform 必须声明 InstanceId 并更改 ProductCode。如果您不提前生成这些,您就不会静态地知道它们是什么,因此以后几乎不可能通过标准机制查询它们。
    • 组件规则仍然适用,并且涉及实例转换使得其含义更难思考。动态这样做可以防止为每个实例创建单独的组件,除非在转换中动态地创建。
    • ProductName must be changed by a transform。虽然这不会使您遇到与生成新 GUID 相同的识别问题,但任何动态生成的转换都不会被签名。因此,使用它们会影响 Windows Installer 显示的 UAC 提示(如果有)。

    其中,只有数字签名问题可能是无法克服的。但是其他问题所涵盖的潜在问题确实很难解决。

    【讨论】:

    • 感谢您提供了很大帮助的知识,有没有一种方法可以使用自定义操作或在安装开始前读取 xml 文件来更改实例产品名称。
    • 是的,但它受制于第三个要点,并且要求您在安装开始之前在引导程序中创建(或选择)转换。 (所以不是自定义操作,很可能“否”更接近答案。)
    【解决方案2】:

    是的 - 只需在您的 Wix 源文件中设置 ProductName 即可更改 ARP 产品名称。

    我正在为多个实例执行此操作,其中我根据 INSTANCENAME 属性设置 ProductName 值,该属性本身是由于 c# 自定义操作而设置的:

    <Property Id ="INSTANCEID" Value ="_" Secure ="yes"/>
    <Property Id ="INSTANCENAME" Secure ="yes"></Property>
    
    <InstanceTransforms Property ="INSTANCEID">
      <Instance Id ="I01" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="I01"/>
      <Instance Id ="I02" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="IO2"/>
      <Instance Id ="I03" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="IO3"/>
    </InstanceTransforms>
    
    <SetProperty Id ="ProductName" Before ="LaunchConditions" Value ="[INSTANCENAME]"></SetProperty>
    

    在自定义操作中:

        session["INSTANCENAME"] = "_" + session["INSTANCENAME"];
    

    InstanceTransforms 中的 ProductName ="I01" 将被 SetProperty 调用替换。

    没错,这个名称不会是显示在卸载对话框中的名称 - 但也许没关系?对我来说,最重要的是在 ARP 区域有一个像样的实例名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      相关资源
      最近更新 更多