2

与えられた:

  1. Wix 3.0 を使用して MSI を作成します。
  2. 製品は複数の機能で構成されています。
  3. 各機能にはいくつかのサブ機能があります。これは標準の MSI 機能ツリーです。
  4. 各機能またはサブ機能は、複数の外部コンポーネントに依存しています。例: .NET 4、ASP.NET など
  5. Wix 3.0 SDK を使用して C# で記述されたカスタム アクションは、これらの依存関係を処理し、特定の機能セットに対してコンポーネントが存在するかどうかを評価します。
  6. インストール時に、指定された機能の選択に対して依存コンポーネントが欠落している場合、インストールは失敗します。

達成すること: 特定のマシンに MSI をインストールすることなく、インストール中にカスタム アクションとして MSI で既に実行されている前提条件チェックを実行する機能。

失敗した試行:

1) カスタムアクションには、このような関数シグネチャがあります

[CustomAction]
public static ActionResult ProcessFeaturePrerequisite(Session session);

セッションオブジェクトを取得するために、Wix 3.0 SDK にある次の API を使用しました

Session session = Installer.OpenPackage("Pathto\\Product.msi", true); // true doesn’t install it. Also tried with false, but didn’t work.

上記のセッションで上記のメソッドを呼び出すと、次のことが失敗します。

session.Features["SomeFeature"].CurrentState;

これは例外をスローします。

System.ArgumentException was unhandled by user code
  Message=Feature ID not registered. SomeFeature
  Source=Microsoft.Deployment.WindowsInstaller
  StackTrace:
       at Microsoft.Deployment.WindowsInstaller.FeatureInfo.get_CurrentState()

また、前提条件のステータスを決定する重要な API の下では、常に false が返されます。

session.EvaluateCondition(prereq);

2) 上記の MSI に機能を指定してインストールするコマンド ラインの方法を知っています。こんなふうになります

msiexec /i "Product.msi" ADDLOCAL=ALL REMOVE="Foo,Bar " 

インストールを開始せずにセッション オブジェクトを返す追加のパラメーターを渡すことができる API が SDK に見つかりませんでした。私の推測では、そのようなパラメーターを渡すと、session.Features がより有効になります。

質問: では、どうすれば上記の目標を達成できますか? ある

  1. インストールを呼び出さずにカスタムアクションを呼び出すことができる Wix SDK の API はありますか?
  2. インストールせずに特定の MSI のコマンド ラインからカスタム アクションを呼び出す方法はありますか?
  3. アクションのみを評価するカスタムアクション名を含むコマンド文字列を受け入れるように MSI を変更するように Wix を作成する方法はありますか?
  4. 同じことをするより良い方法はありますか?
4

1 に答える 1

2

間違ったツールで問題を解決しようとしていると思います。私の知る限り、インストールの前提条件を特定のツール内から確認したいのですが、インストールからではありません。機能が MSI パッケージのカスタム アクションとして実装されている限り、コードを複製しないためにその機能を利用したいと考えています。

あなたの状況では別の方法を選択します:

  1. 前提条件を実際にチェックする機能を別のアセンブリに抽出します。checkprereq.dll
  2. カスタム アクションを参照するようにリファクタリングしますcheckprereq.dll。だけでなく、テーブルにも追加checkprereq.dllする必要があることに注意してください。ここで責任を分割する必要があります。カスタムアクション部分はMSIのもので動作します-あなたの場合、ユーザーが選択した機能の組み合わせに基づいてチェックする前提条件を定義しています-そして機能部分-によって行われる実際の前提条件の検証Binarycustomaction.dllcheckprereq.dll
  3. checkprereq.dllインストールプロセスをトリガーしない前提条件を確認する必要がある場合は、個別に使用してください

ここで概説した試みは、重要な誤った仮定を示していsessionます。インストール時のオブジェクトは、MSI データベースを読み取り専用で開くだけで得られるインストール オブジェクトと同じです。それは真実ではない!実際、sessionインストール トランザクションの外でオブジェクトを参照することに意味があるとは思えません。その名前が示すように、これはインストール セッションです。つまり、進行中のものであり、静的なものではありません。

MSI パッケージは、実行中のインストールではなく単なるファイルである場合は、データベースとして扱う必要があります。したがって、MSI パッケージ内に存在する静的情報のみを照会して使用できるのは、インストールではなく読み取り用に開いた場合だけです。たとえば、テーブルにクエリを実行することはできますがFeature、ユーザーがインストールする機能を選択したかどうかなど、インストール時にのみ意味のある情報がテーブルに含まれているとは思わないでください。

これが理にかなっていて、正しい方向性を示してくれることを願っています。

于 2012-08-03T13:28:03.797 に答える