質問

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

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

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

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

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

  1. aを選びます Feature あなたがコストを取得したいこと
  2. を使用して FeatureComponents テーブル、取得 Component 1からの機能に関連付けられています
  3. を使用して File テーブル、追加します FileSize 2で識別されたコンポーネントに関連付けられたファイルの
  4. 3からの合計は機能インストールのコストです

質問:

  1. インストール前に機能のコストを取得するために使用できるAPI(DTFまたはMSI.DLLから)はありますか? (aがあります FeatureInfo.GetCost DTFのメソッドですが、それを直接使用することはできません。あなたが電話することができる前に、製品は最初にインストールする必要があります 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();

私はもはや無効なHandlerexceptionを取得していませんが、返品されるすべてのファイルコストは-1099511627776です。

役に立ちましたか?

解決 2

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

1ゴッチャ: :コストを計算する前に、4つの標準アクションを実行する必要があります。 costinitialize, ファイルコスト, costfinalizeinstallValidate.

    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();

他のヒント

これはあなたが探している答えではありませんが、ビルド時に機能のサイズを事前に計算し、インストール中に事前に計算されたテーブルを使用することをお勧めします。これが私たちがしていることです 燃えた WIX v3.6で。そうです 多くの より速く 多くの より安定した。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top