2017-08-03 9 views
0

MSIインストーラを使用してカスタムWindowsサービスをアップグレードしています。私は最初にサービスをアンインストールしてから新しいバージョンをインストールするためにMSIプロセスを開始するためにC#コードを使用しています。MSIインストーラを使用してサービスをアップグレードする

私はMSIの新しいバージョンをインストールを開始する前に、以前のバージョンがをアンインストールされていることをを確認する必要があります。このチェックをC#でどのように追加するのですか?

+0

Visual Studioで[setup extension](https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2015InstallerProjects)を使用すると、新しいアプリをインストールする前に以前のアプリ/サービスをアンインストールするアクションが発生します –

+0

どのツールを使用しているかを教えてください。 VSセットアッププロジェクトはインストーラクラスを使用し、他のツールは組み込みのWindowsインストーラ機能を使用します。 – PhilDW

+0

私はInstallSheildを使用しています。この問題は、MSIがレジストリからSERVICEを削除するまでに、私のコードが新しいバージョンのインストールを開始するために起こりました。 MSIはマシンレジストリからサービスを削除しますが、このプロセスのタイムラグが原因で新しいバージョンのインストールが失敗します。これを修正するために、** sc query servicename **を使用してインストール前にサービスの存在を確認しています。サービスが存在する間に 'thread.sleep(1000)' –

答えて

1

これを行うにはWIXを使用することをおすすめします。 MSIのラッパーhttp://wixtoolset.org/documentation/

ベストプラクティスとしてバージョンを増やしてください。

キーは、バージョン属性またはをAllowSameVersionUpgrades = "yes"に設定し、UpgradeCode = "[あなたのユニークなアップグレードコード]"を変更しないことです。 UpgradeCode属性が静的である必要があることを確認してください。ランダムなGUIDを生成する*に設定しないでください。

<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

<Product 
Name="Sample" 
Id="*" 
UpgradeCode="4c79fec3-a6b7-46eb-90d6-46688a7f1662" 
Manufacturer="Sample" 
Version="0.1.3.0" 
Language="1033"> ... /> 

あなたの質問は、レジストリキーHKLM確認し、これをで行う方法をC#

です:あなたはおそらく\ソフトウェア\マイクロソフト\ Windowsの\ CurrentVersionの\アンインストール\

SCのQUERYをその部分をC#コードに置き換えたいだけです。私は、組み込みのWindowsコマンドラインプログラムのほとんどを使用することを強くお勧めします。

0

ため、私は時間によってMSIインストーラは、レジストリからサービスを削除することができ、私のコードは、それの新しいバージョンをインストールを開始し、この問題が起こった ... InstallSheildを使用しています。

したがってMSIはマシンレジストリからサービスを削除しますが、このプロセスのタイムラグが原因で新しいバージョンのインストールが失敗します。これは主にサーバーマシンで発生します。その理由を知らない。もしあればそれを修正するには

、私は今、サービスがを存在している間、私はthread.sleep(1000)

をしていますsc query servicenameを使用してインストールする前に、サービスの存在をチェックし、そうていますより良いアプローチを共有してください。しかし、私はInstallSheildだけを使用してそれを行う必要があります。

関連する問題