10

私たちのビルド プロセスでは、現在、コード ベースではないファイル (イメージ ファイルなど) が Web プロジェクトに追加される可能性がありますが、WiX によってビルドされた MSI インストーラーには含まれません。

これを防ぐために、WiX プロジェクトの AfterBuild ターゲットで次のことを実行します。

  • ビルドされたすべてのファイルの数を取得します (Web 配置プロジェクトからの出力)
  • MSI に組み込まれているすべてのファイルの数を取得します (MSI の「ファイル」テーブルから)
  • カウントを比較し、一致しない場合はビルドに失敗します

Orca を起動すると、ファイル テーブルとカウントを簡単に確認できますが、MSBuild からこれを自動化する方法がわかりません。この情報を MSI から取得するための API またはその他のメカニズムはありますか?

MSI ファイル テーブル カウントを抽出するために、カスタム MSBuild タスクを作成してもかまいません。

4

4 に答える 4

10

新しいビジュアル スタジオ プロジェクトを作成しc:\windows\system32\msi.dll、次のコードへの参照を追加して使用して、msi ファイル内のファイル数を読み取ります。

Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
var installer =
   (WindowsInstaller.Installer)Activator.CreateInstance(installerType);
var msi = installer.OpenDatabase(@"path\to\some\file.msi", 0);
var fileView = msi.OpenView("SELECT FileName FROM File");
fileView.Execute(null);
int fileCount = 0;
while (fileView.Fetch() != null)
{
   fileCount++;
}
Console.WriteLine(fileCount);

このコードはWindowsInstaller.Installer、Windows インストーラー自動化 API のエントリ ポイントである COM オブジェクトを使用します。完全なリファレンス ドキュメントを参照してください。

編集: どうやら wix には、msi.dllC:\program files\Windows Installer XML v3\sdkをラップするマネージド アセンブリ (in) が付属しています。これは、ロブが答えで「DTF」と呼んでいるものだと思います。Microsoft.Deployment.WindowsInstaller アセンブリと名前空間の型を使用すると、コード サンプルが次のように簡略化されます。

var database = new Database(@"\path\to\some\file.msi");
var list = database.ExecuteQuery("SELECT FileName FROM File");
Console.WriteLine(list.Count);
于 2009-03-21T18:44:32.887 に答える
5

MSI ファイルは、カスタム SQL エンジンを備えた小さなデータベースです。クエリを実行するだけです:

SELECT `File` FROM `File` 

戻ってくる行の数を数えます。MSBuild タスクに統合する最も簡単な方法は、すべての MSI API にマネージド ラッパーを提供する WiX の DTF を使用することでしょう。

すべてのツールを配置すると、ソリューションは非常に簡単になります。

于 2009-03-21T17:44:50.753 に答える
0

WinRAR は、MSI を (.rar 拡張子を付けた後) 自己解凍型 CAB アーカイブとして識別します。ファイルをどこかにコピーして名前を変更し、WinRAR で解凍してから、ファイルを数えることができると思います。ただし、ファイルには元の名前はありません。

これは少し時代遅れのようで、役立つかどうかわかりません。

于 2009-03-21T01:16:43.997 に答える