2011-01-26 10 views
0

私たちは、私たちのインストールのためにカスタムの追加/外部UIを作っています。インストールの前に機能のインストール費用を手に入れてください

MSIのような「カスタムインストール」ダイアログボックスを使用して、インストールまたは削除する機能をユーザーが選択できるようにします。

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

ただし、機能をインストールするためのコストも表示する必要があります。 Windowsインストーラの[カスタムインストール]ダイアログボックスでこれを行うことができます。

私たちは、次の操作を実行して動作を模倣することができると思う:

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

質問:

  1. は、我々はインストール前に機能のコストを取得するために使用することができます(どちらかDTFやMSI.DLLから)APIはありますか? (FeatureInfo.GetCostProductInstallationから呼び出す前に、製品をインストールする必要があります)
  2. 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です。

答えて

1

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

1ガッチャCostInitializeFileCostCostFinalizeのInstallValidate:あなたはコストを計算する前に、4つの標準のアクションを実行する必要があります。

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

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

+0

これはまさに私たちがやったことです。サイズに関する問題は、s.DoAction( "InstallValidate")を呼び出すことによって解決されました。 OpenPackageを呼び出すと実際にはいくつかのシナリオで問題になるかもしれないエンジン(MSIEXEC)が実際に "起動"され、コストを "対話的に"計算するのに時間がかかるため、事前計算が最も効果的です。提案していただきありがとうございます! :) – Ian

関連する問題