2016-11-24 11 views
0

インスタンス変換を使用して複数のインスタンスを持つように設定したWix wxsファイルがあります。Wixインスタンス変換動的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

多くの助けをしていただきありがとうございます。カスタムアクションを使用してInstance ProductNameを変更したり、インストールを開始する前にxmlファイルを読み込んだりする方法はありますか? – Vinay

+0

はい、それは3番目の箇条書きの対象であり、インストールを開始する前にブートストラップでトランスフォームを作成(または選択する)する必要があります。 (カスタムアクションではないので、答えに近いと思われる場合は「いいえ」と考えられます)。 –

1

はい - あなたのWixソースファイルにProductNameを設定するだけで、ARP ProductNameを変更することは可能です。

私は自分自身をAC#のカスタムアクションの結果として設定されます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"]; 

InstanceTransformsProductName ="I01"は、SetPropertyコールで置き換えられます。

本当に、この名前はアンインストールダイアログに表示される名前ではありませんが、大丈夫ですか?私のために最も重要なことは、ARPエリアにまともなインスタンス名を持つことでした。

関連する問題