私たちは、私たちのインストールのためにカスタムの追加/外部UIを作っています。インストールの前に機能のインストール費用を手に入れてください
MSIのような「カスタムインストール」ダイアログボックスを使用して、インストールまたは削除する機能をユーザーが選択できるようにします。
現在、MSIデータベース自体から機能(および説明のような他の機能の詳細)を読み取ることができます(Feature
テーブルでSQLクエリを実行することによって)。
ただし、機能をインストールするためのコストも表示する必要があります。 Windowsインストーラの[カスタムインストール]ダイアログボックスでこれを行うことができます。
私たちは、次の操作を実行して動作を模倣することができると思う:
- を
Component
が1 からの特徴に関連付けられます、あなたは
- を取得したい
Feature
を選択 File
テーブルを使用して、2- で識別されるコンポーネントに関連付けられたファイルの
FileSize
を追加します。3からの合計は、機能のインストール012のコストです
FeatureComponents
テーブルを使用してコスト
質問:
- は、我々はインストール前に機能のコストを取得するために使用することができます(どちらかDTFやMSI.DLLから)APIはありますか? (
FeatureInfo.GetCost
をProductInstallation
から呼び出す前に、製品をインストールする必要があります) APIがない場合は、上記の手順が適切かどうかを計算する機能のインストールのコスト?
ありがとう! :)
UPDATE#1
私は前であってもインストールを開始するAPIを介して機能のインストールのコストを取得する方法があると思います。ここで私はそれをやった方法は次のとおりです。
info.name
を呼び出す
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.GetCost
を呼び出すと、InvalidHandlerException
が返されます。「選択マネージャは初期化されていません」というメッセージが表示されます。
ここに私が現在いる場所があります。
更新#2:
私はinfo.GetCost
を呼び出す前に、私は必要なfile costing routinesを呼び出すわけではないので、私はInvalidHandlerException
を得ていました。ここに私の修正コードはません:
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です。
これはまさに私たちがやったことです。サイズに関する問題は、s.DoAction( "InstallValidate")を呼び出すことによって解決されました。 OpenPackageを呼び出すと実際にはいくつかのシナリオで問題になるかもしれないエンジン(MSIEXEC)が実際に "起動"され、コストを "対話的に"計算するのに時間がかかるため、事前計算が最も効果的です。提案していただきありがとうございます! :) – Ian