特定の.msiパッケージをC#.NETアプリケーションからプログラムでインストールしたいのですが、できればアプリケーションで指定されたインストールパラメーター(インストールパス、拒否のクラップウェアなど)を使用してインストールします。
いくつか検索しましたが、特に役立つものは見つかりませんでした。最も有望なヒットは このトピック でしたが、Microsoft.Deployment.WindowsInstaller
またはWindowsInstaller.Installer
のドキュメントが見つかりません。
上記の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を大まかにラップしているため、ドキュメント ここ も役立ちます。これが、上記のスニペットの文字列を次のように処理した方法です。私の状況に合っています。
インストーラー用の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 に関するドキュメントがあります。
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を使用することを強くお勧めします。
最も簡単な解決策は、msiexec
を使用して.msiでインストーラーを呼び出すことです。
.msiプロパティの設定、サイレントインストールなどのコマンドライン設定を使用して、インストールをカスタマイズできます。
問題を解決するには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/InstallShield
のMSI
を編集する必要があります。
上記の例で使用されているパラメータは普遍的ではありません。
カスタムアクションなどが存在するため、実際のインストールは複雑になる可能性があります。実際、msiのカスタマイズを中心に構築されている業界全体があります。 Applications Repackaging
と呼ばれます。
基本的な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);