2016-04-07 9 views
0

が、私はコードをMSIをインストールしようとしていますスロー、と私は、このソリューションに出くわした Programatically installing MSI packagesInstaller.InstallProductは例外

コード:

public static void Install() 
{ 
    try 
    { 
     Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer"); 
     Installer installer = (Installer)Activator.CreateInstance(type); 
     installer.InstallProduct("D:\\Applications\\TortoiseSVN-1.9.3.27038-x64-svn-1.9.3", "ACTION=INSTALL"); 
    } 
    catch(Exception e) 
    { 
     Utilities.showErrorMessageBox(e.Message); 
    } 
} 

私が手に例外はないこの説明のメッセージがあります:{」 InstallProduct、PackagePath、PropertyValues "}

私はそれをどのようにして作るのか分かりません。私はPropertyValuesのいろいろな組み合わせも試したが、役に立たなかった。

誰かがこのエラーの原因を説明できますか?

EDIT以下の作品を使用して

System.Diagnostics.Process.Start("D:\\Applications\\TortoiseSVN-1.9.3.27038-x64-svn-1.9.3.msi"); 

ので、この方法は、インストーラを使用してのように細いのですか?

+0

私は、最初のコードがファイルパスに ".msi"を持っていないことに気付きましたか? –

+0

はい私はそれを逃しましたが、パス内に.msiを追加した後も同じ例外が発生します –

+1

インストールを開始するためにインストーラAPIを使用したことは一度もありません。私はちょうどあなたがしたようにProcess.Startを使用してmsiを実行しますが、私は使用することをお勧めします:msiexec.exe/i yossiz74

答えて

0

IMO最も簡単な方法は、直接API MsiInstallProductを呼び出して、結果を調べて何が起きたかを確認することです。 P/Invokeの署名は簡単で、あなたが言及したその記事の終わりです。

Programatically installing MSI packages

私が見る他の多くの試みの問題は、不必要なCOM層の導入です。したがって、環境が正しくなければ(スレッド、アパートメントなど)、COMレイヤーで失敗する可能性があります。また、失敗すると、MsiInstallProductが返す単純なエラーがわかりにくくなります。例外(おそらく内部例外)の

閉じる検査は、このリストから、多分4桁、MsiInstallProductからHRESULTまたは整数結果が表示される場合があります:

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

そうでない場合に、Windowsインストーラのログポリシーを設定ログ文字列にvoicewarmupxと

https://support.microsoft.com/en-us/kb/223300

、その後MSIxx.logファイルは、%TEMP%をで見て:詳細なログを作成します。これは、あなたの環境が問題を引き起こしていないことを前提としています。ローカルシステムアカウントのようなものからコードを実行している場合、MSIがローカルシステムアカウントのデスクトップのようなアイテムにアクセスしようとすると、失敗する可能性があります。何が起きているのかを見るにはログが必要です。 MSIファイルにUIがなく、標高が必要な場合は標高を求めず、失敗します。外部CABファイルがあれば、それを見つけることができず、失敗する可能性があります。マップされたドライブの場所から実行されている場合は、それも失敗する可能性があります。環境が重要なので、これはコードだけではありません。コーディングに関係しない多くの失敗点があります。