2

私は 2 つの MSI を持っています。framework.msiproduct.msi。は、インストールとアンインストールの両方で依存する framework.msiGAC に dllをインストールします。product.msi

2 つの MSI を連結する BA を作成しました。

<Bundle ...>
  <Chain>
    <PackageGroupRef Id='framework'/>
    <PackageGroupRef Id='product'/>
  </Chain>
</Bundle>
<Fragment>
  <PackageGroup Id="framework">
    <MsiPackage Name="Product Framework"
                ForcePerMachine="yes"
                SourceFile="framework.msi"
                Vital="yes"
                Cache="no"
                Permanent="no"
                Compressed="yes"
                Visible="yes"/>
  </PackageGroup>
  <PackageGroup Id="product">
    <MsiPackage Name="Product"
                ForcePerMachine="yes"
                SourceFile="product.msi"
                Vital="yes"
                Cache="no"
                Permanent="no"
                Compressed="yes"
                Visible="yes"/>
  </PackageGroup>
</Fragment>

新規インストールの場合、myframework.msiおよびproduct.msiinstall は正しく行われます。新しいバージョンにアップグレードしようとすると、framework.msi正常にアップグレードされます。その後、 のアンインストールに進みproduct.msiますが、失敗します (このエラー: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load file or assembly 'CheckInstaller, Version=1.0.0.0' or one of its dependencies. The system cannot find the file specified.)。これは、アンインストールが GAC に存在しないCustomActionバージョンのアセンブリ ( ) を参照しているためです (アップグレードの一部としてアップグレードされたため)。CheckInstallerframework.msi

カスタム BA を作成することなく、次のようなことができるようにしたいと考えています。

// pseudo code
if(product.Exists() && framework.Exists())
{
  product.Uninstall(); // product is dependent on the framework
  framework.Uninstall();
}
framework.Install();
product.Install();

2 つの MSI を 1 つの大きな製品に統合すれば、これは可能になると思いますが、framework.msi他のチームに分散させたり、その他のさまざまな理由から、それらを分離しておく必要があります。

私がやりたいことは、WiX ブートストラッパーでも可能ですか?

4

1 に答える 1

3

今日のBurnではそれは不可能です。チェーンは固定です。インストール時には順方向に実行され、アンインストール時には逆方向に実行されます。現在利用可能な 2 つのオプションを考えることができます。

  1. MSI を相互にアップグレードせず、新しいバンドルが古いバンドルをアンインストールするときに古い MSI を削除します。

  2. パッケージ間でインストール時の依存関係を作成しないようにします。とにかく、これは一般的には良いことです。

現在のようにインストール後ではなく、インストールに古いバンドルを削除する機能を新しいバンドルに持たせることが機能要求になるかもしれませんが、現時点ではサポートされていません。

于 2013-05-16T22:29:47.370 に答える