たとえば、MSI インストール ファイルがある場合、インストールせずに C# または C++ プログラムからその内容を抽出できますか?
2 に答える
通常、管理インストールを実行して、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();
}
}
}
}
MSI ファイルはCOM 構造化ストレージです。基本的にはデータベースです。msdn で詳細なドキュメントを見つけることができます。