9

たとえば、MSI インストール ファイルがある場合、インストールせずに C# または C++ プログラムからその内容を抽出できますか?

4

2 に答える 2

12

通常、管理インストールを実行して、MSIのコンテンツを抽出できます。

msiexec /a foo.msi TARGETDIR=C:\EXTRACTHERE /qn

プロセスを終了したくない場合は、MsiInstallProduct関数を介してMSIと直接相互運用できます。

szPackagePath[in]Windowsインストーラパッケージの場所へのパスを指定するnullで終了する文字列。文字列値には、URL、ネットワークパス、ファイルパス(例:file://packageLocation/package.msi)、またはローカルパス(例:D:\ packageLocation \ package.msi)を含めることができます。

szCommandLine[in]コマンドラインプロパティ設定を指定するnullで終了する文字列。これは、Property = Setting Property=Settingの形式のリストである必要があります。詳細については、プロパティについてを参照してください。

管理インストールを実行するには、szCommandLineにACTION=ADMINを含めます。詳細については、ACTIONプロパティを参照してください。

P / Invokeを自分で宣言することはできますが、 Deployment Tools Foundation(DTF)と呼ばれる非常に優れた.NET相互運用ライブラリがWindowsInstalerXMLで利用できることに注意してください。Microsoft.Deployment.WindowsInstaller名前空間には、InstallProductという静的メソッドを公開するInstallerというクラスメソッドがあります。これは、MsiInstallProductの直接カプセル化です。

DTFライブラリを使用すると、Win32 APIの醜さから身を隠し、必要に応じてIDisposableを正しく実装して、基になるアンマネージドハンドルが必要に応じて解放されるようにします。

さらに、DTFには、InstallPackageクラスを持つMicrosoft.DeploymentWindowwsInstaller.Package名前空間があります。このクラスは、ファイルを作業ディレクトリに抽出するExtractFiles()というメソッドを公開します。コードの例は次のようになります。

using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Deployment.WindowsInstaller.Package;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using( var package = new InstallPackage(@"C:\test.msi", DatabaseOpenMode.ReadOnly))
            {
                package.ExtractFiles();
            }
        }
    }
}
于 2012-09-19T12:32:36.860 に答える
4

MSI ファイルはCOM 構造化ストレージです。基本的にはデータベースです。msdn で詳細なドキュメントを見つけることができます。

  • データベース API は次のとおりです
  • ここでは、複合バイナリ ファイル形式に関する情報を見つけることができます。
  • Windowsインストーラーに関するドキュメントは次のとおりです
于 2012-09-19T06:22:28.737 に答える