インストール用のカスタム ブーストラップ / 外部 UI を作成しています。
ユーザーがインストールまたは削除する機能を選択できるように、(MSI のような) "カスタム インストール" ダイアログを提供したいと考えています。
現在、MSI データベース自体から機能 (および説明などのその他の機能の詳細) を読み取ることができます (Feature
テーブルに対して SQL クエリを実行することにより)。
ただし、機能をインストールするためのコストも表示したいと考えています。Windows インストーラーの [カスタム インストール] ダイアログは、これを行うことができます。
次のようにすることで、動作を模倣できると思います。
Feature
コストを取得したい を選択してくださいFeatureComponents
テーブルを使用しComponent
て、フィーチャに関連付けられている を 1 から取得します。- 表を使用して、2 で特定されたコンポーネントに関連付けられているファイルを
File
追加します。FileSize
- 3 の合計は、機能のインストールのコストです
質問:
- インストール前に機能のコストを取得するために使用できる API (DTF または MSI.DLL のいずれか) はありますか? (
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();
InvalidHandlerException を取得しなくなりましたが、返されるすべてのファイル コストは -1099511627776 です。