1

インストール用のカスタム ブーストラップ / 外部 UI を作成しています。

ユーザーがインストールまたは削除する機能を選択できるように、(MSI のような) "カスタム インストール" ダイアログを提供したいと考えています。

現在、MSI データベース自体から機能 (および説明などのその他の機能の詳細) を読み取ることができます (Featureテーブルに対して SQL クエリを実行することにより)。

ただし、機能をインストールするためのコストも表示したいと考えています。Windows インストーラーの [カスタム インストール] ダイアログは、これを行うことができます。

次のようにすることで、動作を模倣できると思います。

  1. Featureコストを取得したい を選択してください
  2. FeatureComponentsテーブルを使用しComponentて、フィーチャに関連付けられている を 1 から取得します。
  3. 表を使用して、2 で特定されたコンポーネントに関連付けられているファイルをFile追加します。FileSize
  4. 3 の合計は、機能のインストールのコストです

質問:

  1. インストール前に機能のコストを取得するために使用できる API (DTF または MSI.DLL のいずれか) はありますか? ( FeatureInfo.GetCostDTF にはメソッドがありますが、それを直接使用することはできません。FeatureInfo.GetCostから呼び出す前に、まず製品をインストールする必要がありますProductInstallation)
  2. API がない場合、上記の手順は、機能のインストールのコストを計算するのに適切または正しいですか?

ありがとう!:)

更新 # 1

インストールを開始する前であっても、API を介して機能のインストールのコストを取得する方法があると思います。これが私がそれをした方法です:

Installer.SetInternalUI(InstallUIOptions.Silent);

Session s = Installer.OpenPackage(@"C:\a.msi", false);

foreach (FeatureInfo info in s.Features)
{
    MessageBox.Show(info.Name);
    MessageBox.Show(info.GetCost(false, false, InstallState.Unknown).ToString());
}
s.Close();

呼び出しinfo.nameに成功すると、機能の名前が返されます。ただし、呼び出すと、「選択マネージャーが初期化されていません」というメッセージinfo.GetCostが返されます。InvalidHandlerException

私が現在いる場所はここです。

更新 #2:

を呼び出す前にInvalidHandlerException、必要なファイル コスト計算ルーチンを呼び出していないため、 を取得していましたinfo.GetCost。これが私の変更されたコードです:

  Installer.SetInternalUI(InstallUIOptions.Silent);

  Session s = Installer.OpenPackage(@"C:\1.msi", false);
  s["ROOTDRIVE"] = @"C:\";
  s.DoAction("CostInitialize");
  s.DoAction("FileCost");
  s.DoAction("CostFinalize");

  foreach (FeatureInfo info in s.Features)
  {
       long cost = info.GetCost(false, false, InstallState.Local);
       MessageBox.Show(info.Title + " " + cost);
  }
  s.Close();

InvalidHandlerException を取得しなくなりましたが、返されるすべてのファイル コストは -1099511627776 です。

4

2 に答える 2

3

はい、API があります。OpenPackage を呼び出して MSI セッションを取得する必要があります。これにより、GetCost メソッドにアクセスできる機能リストにアクセスできるようになります。

1落とし穴: コストを計算する前に、次の 4 つの標準アクションを実行する必要があります: CostInitializeFileCostCostFinalize、およびInstallValidate

    Installer.SetInternalUI(InstallUIOptions.Silent);

    Session s = Installer.OpenPackage(@"C:\1.msi", false);
    s.DoAction("CostInitialize");
    s.DoAction("FileCost");
    s.DoAction("CostFinalize");
    s.DoAction("InstallValidate");

    foreach (FeatureInfo info in s.Features)
    {
        long cost = info.GetCost(false, false, InstallState.Local);
        MessageBox.Show(info.Title + " " + cost);
    }
    s.Close();
于 2011-02-11T09:36:16.830 に答える
2

これはあなたが探している答えではありませんが、ビルド時に機能のサイズを事前に計算し、インストール時に事前に計算されたテーブルを使用することをお勧めします。これは、Burn in WiX v3.6 で行っていることです。それははるかに高速で、はるかに安定しています。

于 2011-02-10T20:47:37.390 に答える