2016-11-24 46 views
0

我有一个Wix wxs文件,其中我已经配置了使用实例变换的多个实例。Wix实例转换Dynamic ProductName和Id

<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 而不对其进行硬编码。

回答

1

实例转换必须提前创建。虽然在技术上没有任何东西阻止引导程序在调用MSI之前的安装时动态生成转换,但多种实际问题确实会阻止这一点。

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

其中,只有数字签名问题可能是不可逾越的。但其他问题所涉及的潜在问题实际上很难做到。

+0

非常感谢您提供的帮助,有没有一种方法可以在安装开始之前使用自定义操作或通过读取xml文件来更改实例ProductName。 – Vinay

+0

是的,但它是受第三点,并要求你创建(或者选择)一个在你的引导改造安装开始前。 (所以不是一个自定义的动作,最有可能的“不”是更接近于答案。) –

1

是的 - 可以通过在您的Wix源文件中设置ProductName来更改ARP产品名称。

我这样做是对的多个实例,我根据其本身被设置为C#自定义操作的结果INSTANCENAME属性设置的产品名称值:

<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区域有一个体面的实例名称。