6

VS2005 を使用して C# で記述された Windows サービスがあります。

インストールは、msiexec を呼び出して、同じく VS2005 を使用して作成された msi ファイルをインストールするウィザードを介して行われます。

サービスのあるバージョンから別のバージョンにアップグレードする msi ファイルの生成に問題があります。ウィザード プログラムは、現在インストールされているバージョンの検出、サービスの停止、msiexec の適切なコマンド ラインの作成、およびサービスの再起動を処理します。

既存の msi のバージョン プロパティは 1.1.02 で、新しいものは 1.1.03 です。製品コードとアップグレード コードは同一です。

「クリーンな」システムに 1.1.03 をインストールする場合と同様に、プログラムの追加と削除を介して 1.1.02 を手動でアンインストールすると問題なく動作します。

1.1.02 から 1.1.03 へのアップグレードは一連の流れですが、最終的には 1.1.02 がインストールされます。

ウィザードがアップグレードに使用するコマンド ラインは次のとおりです。

msiexec /qb /i "MyProduct.msi" REINSTALL="ALL" REINSTALLMODE="vos"

どこが間違っていますか?かなり基本的なことを見逃しているに違いないと思います...

フォールバックの立場は、ウィザードを実行して 1.1.03 をインストールする前に手動で 1.1.02 をアンインストールする必要があることを顧客に通知することですが、私はむしろそれを行う必要はありません。

追加するために編集:

製品コードを変更すると (VS2005 にもプロンプトが表示されるため)、実際にはアップグレードする機能がまったく削除されます。その製品コードが以前にインストールされていない場合、インストーラーは再インストールを許可しないためです。

あとはインストールするだけです (その後、通常の「サービスは既に存在します」というメッセージが表示されます)。

4

3 に答える 3

8

以前のバージョンを自動的に削除したい場合、「アップグレード」を MSI で動作させるには、いくつかの作業を行う必要があります。

最初に、謎の「コード」に関する背景情報をいくつか。MSI に関連付けられている 3 つのコード (GUID) があります。

  1. パッケージ コード- これは、MSI インストーラーの特定のバージョンを識別し、ビルド間で再利用しないでください。常に更新する必要があります。
  2. 製品コード- この識別子は、アプリケーションの特定のバージョンを識別するために使用されます。新しい製品コードをいつ割り当てるかは、インストーラーの作成者が決定します。
  3. アップグレード コード- これはアプリケーションを識別し、その存続期間を通じて変更されるべきではありません

アップグレード コードは決して変更しないでください。シーンリオをアップグレードするには、バージョンごとにプロダクト コードを変更する必要があります。さらに、おっしゃったように、バージョン番号を上げなければなりません。製品コードアップグレード コードは、セットアップ プロジェクトを選択して [プロパティ] ウィンドウに移動すると見つかります。パッケージ コードは Studio に表示されず、常に更新されます。

おそらく不足している項目は、プロパティ ウィンドウの RemovePreviousVersions 設定をtrueに設定する必要があることです。

于 2009-02-04T20:33:28.157 に答える
7

mohlsenの回答に加えてもう1つ(Visual Studio 2008の場合):

プライマリ出力(EXE!)を適切にアップグレードするには、ファイルバージョンをインクリメントする必要があります

この設定は、プロジェクトのプロパティ:[アプリケーション]タブ->[アセンブリ情報]にあります。

于 2009-10-02T15:45:04.133 に答える
2

これを管理する簡単な方法は、メインの実行可能ファイルとすべての管理対象DLLを含むすべてのアセンブリからAssemblyFileVersionを削除することです。

各AssemblyInfo.csファイルで、バージョン番号を気にしないが、ある程度のトレーサビリティが必要な場合は、このようなことを行うことをお勧めします。

[assembly: AssemblyVersion("1.1.*")]
// don't need this [assembly: AssemblyFileVersion("1.0.0.0")]

それでもすべてが正常にコンパイルされ、AssemblyFileVersionが定義されていない場合、インストーラーはすべてが毎回異なると想定します(メインEXEの隣にすべてのDLLをインストールする場合はおそらく問題ありません)。

特に手動で何もインクリメントする必要がない場合は、これを理解するのに長い時間を費やしました。

于 2011-05-25T20:51:56.150 に答える