インストール前に機能のインストールコストを取得します
-
24-10-2019 - |
質問
インストール用にカスタムブーストッパー /外部UIを作成しています。
ユーザーがインストールまたは削除する機能を選択できるようにするために、「カスタムインストール」ダイアログ(MSIのような)を提供します。
現在、MSIデータベース自体から機能(およびその他の機能の詳細)を読むことができます(SQLクエリを実行することにより Feature
テーブル)。
ただし、機能をインストールするコストも表示したいと考えています。 Windowsインストーラー「カスタムインストール」ダイアログはこれを行うことができます。
次のことを行うことで、動作を模倣できると思います。
- aを選びます
Feature
あなたがコストを取得したいこと - を使用して
FeatureComponents
テーブル、取得Component
1からの機能に関連付けられています - を使用して
File
テーブル、追加しますFileSize
2で識別されたコンポーネントに関連付けられたファイルの - 3からの合計は機能インストールのコストです
質問:
- インストール前に機能のコストを取得するために使用できるAPI(DTFまたはMSI.DLLから)はありますか? (aがあります
FeatureInfo.GetCost
DTFのメソッドですが、それを直接使用することはできません。あなたが電話することができる前に、製品は最初にインストールする必要がありますFeatureInfo.GetCost
からProductInstallation
) - 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, ファイルコスト, costfinalize と 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();
他のヒント
これはあなたが探している答えではありませんが、ビルド時に機能のサイズを事前に計算し、インストール中に事前に計算されたテーブルを使用することをお勧めします。これが私たちがしていることです 燃えた WIX v3.6で。そうです 多くの より速く 多くの より安定した。