web-dev-qa-db-ja.com

MSIパッケージをプログラムでインストールする

特定の.msiパッケージをC#.NETアプリケーションからプログラムでインストールしたいのですが、できればアプリケーションで指定されたインストールパラメーター(インストールパス、拒否のクラップウェアなど)を使用してインストールします。

いくつか検索しましたが、特に役立つものは見つかりませんでした。最も有望なヒットは このトピック でしたが、Microsoft.Deployment.WindowsInstallerまたはWindowsInstaller.Installerのドキュメントが見つかりません。

12
ShdNx

上記のDeploymentTools Foundationプロジェクトは、.NETからこれを行うための確実な方法であることがわかりました。 Microsoft.Deployment.WindowsInstaller.dllを参照したら、次のようなコードを使用してパッケージをインストールします。

Installer.SetInternalUI(InstallUIOptions.Silent);
Installer.InstallProduct(msiFilename, "ACTION=INSTALL ALLUSERS=2 MSIINSTALLPERUSER=");

.NETラッパーのドキュメントは、ProgramFilesのWindowsインストーラーXMLインストールディレクトリにある.chmファイルにあります。その一部DLLネイティブのWindowsAPIを大まかにラップしているため、ドキュメント ここ も役立ちます。これが、上記のスニペットの文字列を次のように処理した方法です。私の状況に合っています。

14
Stephen Hewlett

インストーラー用のAPIを提供するCOMオブジェクトがあります。

まず、COMオブジェクト「MicrosoftWindowsインストーラオブジェクトライブラリ」への参照をプロジェクトに追加します。次に、次のコードから始めることができます。

using System;
using WindowsInstaller;

namespace TestApp
{
    public class InstallerTest
    {
        public static void Install()
        {
            Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
            Installer installer = (Installer)Activator.CreateInstance(type);
            installer.InstallProduct("YourPackage.msi");
        }
    }
}

そして、 Installer Object に関するドキュメントがあります。

8
Codo

WIX3.5インストールの一部である "Deployment Tools Foundation"プロジェクトには、ほとんどの(すべてではないにしても)Windows用の.NETラッパーが含まれています。インストーラーAPI。 WiXインストールをダウンロードしてインストールすることで入手できます: http://wixtoolset.org/ (現在WiX 3.11、2017年8月更新)。

Microsoft.Deployment.WindowsInstaller.dllファイルを%ProgramFiles%\ Windows Installer XMLv3。??\SDK \フォルダーに配置します。 C#プロジェクトに参照を設定し、さまざまなAPIを実行して、目的の機能が得られるかどうかを確認してください。

.NETコードからのCOM相互運用機能よりもDeploymentToolsFoundationを使用することを強くお勧めします。

7
Stein Åsmul

最も簡単な解決策は、msiexecを使用して.msiでインストーラーを呼び出すことです。

.msiプロパティの設定、サイレントインストールなどのコマンドライン設定を使用して、インストールをカスタマイズできます。

3
David Heffernan

問題を解決するには2つのアプローチがあります。

@Glytzhkofが最初に言及したのは、Microsoft.Deployment.WindowsInstaller .NET wrapper APIを使用することです。これは非常に強力なものですが、慣れるまでに少し時間がかかります。最新バージョンを入手できます ここ[〜#〜] update [〜#〜]SteinÅsmul28.12.2018:DTFはWiXツールキットの一部になりました)。

もう1つのアプローチは、 Transforms (。MSTファイル)を使用することです。変換ファイルは、MicrosoftOrcaまたはInstallShiledを使用して生成できます。 MSTには、必要なすべてのカスタマイズが含まれており、次のコマンドラインを使用してMSIに適用できます。

msiexec /i somemsi.msi TRANSFORMS=somemst.mst /qb

さらに、コマンドラインで直接パラメータを渡すことができます。

msiexec /i <somemsi.msi> /qb AGREETOLICENSE=YES INSTALLDIR=C:\Temp
etc...

ただし、実際に使用されるパラメーターを判別するには、ORCA/InstallShieldMSIを編集する必要があります。

上記の例で使用されているパラメータは普遍的ではありません。

カスタムアクションなどが存在するため、実際のインストールは複雑になる可能性があります。実際、msiのカスタマイズを中心に構築されている業界全体があります。 Applications Repackagingと呼ばれます。

3
CodeWarrior

基本的なWin32API(必要に応じてピンボックできます)はMsiInstallProductです。これは、事実上、言及されている他のすべてのAPIと呼び出しが終了する場所です。

https://msdn.Microsoft.com/en-us/library/aa370315(v = vs.85).aspx

MSIファイルとコマンドライン(クワイエットオプションなどを含む)へのフルパスを渡し、結果をチェックして、正しくインストールされているかどうかを確認するだけです。

マネージコードには単純なp/invoke宣言があることに注意してください。

[DllImport( "msi.dll"、CharSet = CharSet.Auto、SetLastError = true)]

static extern UInt32 MsiInstallProduct(string packagePath、string commandLine);

3
PhilDW