8

ユーザーが3つのオプションのどれをインストールするかを選択できる焼き込みインストールがあります-それぞれが、チェーン内の3つのMsiPackagesの1つに直接関連しています。

<Chain>
  <MsiPackage SourceFile="..\ProductA\bin\Release\ProductA.msi"  InstallCondition="chkProductA" />
  <MsiPackage SourceFile="..\ProductB\bin\Release\ProductB.msi"  InstallCondition="chkProductA" />
  <MsiPackage SourceFile="..\ProductC\bin\Release\ProductC.msi"  InstallCondition="chkProductC" />
</Chain>

大丈夫だ。ただし、次に msi を実行するときは、最初に選択された項目のみを再インストール/更新したいと考えています。つまり、productA のみが選択されている場合、製品 B と C をインストールしたくありません。

最初に選択されたものを確認するにはどうすればよいですか?

4

2 に答える 2

10

OK、並べ替えたので、ソリューションを投稿するのが最善です。

最終的には2つの部分に要約されます...

a) インストール時に設定される各製品 MSI にレジストリ キーを設定します。その MSI が最初にインストールされていない場合、レジストリ エントリは存在しません。すなわち

  <!-- registry entry to state that the item has been installed-->
  <Component Id="cmp_WriteToRegistry" Guid="[yourguid]">
    <RegistryKey Root="HKLM"
                 Key="Software\MyCompany]"
          Action="createAndRemoveOnUninstall">
      <RegistryValue Type="integer" Name="ProductA" Value="1" KeyPath="yes"/>
    </RegistryKey>
  </Component>

b) アップグレードの実行中にそのレジストリ キーの存在を確認しています...

<!-- Determine what items are to be installed in the event of an install using the BA-->
<WixVariable Id="chkProductA" Value="![CDATA[chkProductA]]" />
<WixVariable Id="chkProductB" Value="![CDATA[chkProductB]]" />
<WixVariable Id="chkProductC" Value="![CDATA[chkProductC]]" />

<!-- Determine what items are installed in the event of an upgrade-->
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductAInstalled" Variable="ProductAInstalled" Result="exists" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductBInstalled" Variable="ProductBInstalled" Result="exists" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductCInstalled" Variable="ProductCInstalled" Result="exists" />

<Chain>
  <MsiPackage SourceFile="..\SetupProductA\bin\Release\SetupProductA.msi"
              InstallCondition="chkProductA OR ProductAInstalled" />
  <MsiPackage SourceFile="..\SetupProductB\bin\Release\SetupProductB.msi"
              InstallCondition="(chkProductB) OR (ProductBInstalled)" />
  <MsiPackage SourceFile="..\SetupProductC\bin\Release\SetupProductC.msi"
              InstallCondition="(chkProductC) OR (ProductCInstalled)" />
</Chain>

</Bundle>

したがって、InstallCondition では、UI が使用され、それぞれのチェックボックスがチェックされている場合、chkProductA は true と評価され、ProductAInstalled は、それぞれの製品が既にインストールされている場合に true と評価されます。私の場合、ユーザーの操作なしで更新が行われます。

方法がわかれば簡単。私は確かに最初からではありませんでした...

于 2012-10-19T13:38:56.143 に答える
3

独自のマネージ ブートストラップ アプリケーションを実行している場合は、DetectPackageComplete イベント ハンドラーでこれを実行できます。

CustomBA_DetectPackageComplete(object sender, DetectPackageCompleteEventArgs e)
{
    if (e.PackageId == "SetupProductA" && e.State == PackageState.Present)
    {
        CustomBA.Engine.NumericVariables["chkProductA"] = 1;
    }
    etc...
}

を使用して、インストールされた機能を検出するために同様のことができますDetectMsiFeature

そうは言っても、カスタム BA が既にある場合にのみ、この方法を使用します。カスタム BA の構築は大変な作業です。

于 2013-08-30T17:04:29.133 に答える