web-dev-qa-db-ja.com

インストーラーは既存のアプリを上書きしません

8つのプロジェクトを含むVisual Studio 2010ソリューションがあります。また、インストールを作成するためにビルドするセットアッププロジェクトもあります。

クライアントPCへの最初のインストールで問題なく動作します。ただし、プロジェクトを変更して新しいセットアップを構築し、クライアントに渡します。この場合、クライアントは最初に手動で最後のインストールをアンインストールしてから、セットアップを実行する必要があります。

アンインストールせずにセットアップを実行すると、既存のファイル(exeとdll)が上書きされないようです。通常、変更されるのはexeだけです。ただし、上書きすることはありません。クライアントマシンのバージョンは同じままのようです。

強制的に上書きする方法はありますか?

メインアプリケーションプロジェクトを変更すると、プロジェクトのプロパティ、アセンブリ情報に移動し、ファイルバージョンだけでなくアセンブリバージョンも増加することに注意してください。

29
Craig

Visual Studioインストーラーは、インストールを適切に制御できれば、市販製品やWiXに比べてもユーザーフレンドリーではありません。

Visual Studioセットアッププロジェクトがある場合、アップグレードプロセスに関係するいくつかのプロパティがあります。

1)アップグレードコード-これは同じilkのインストーラー間のリンクであり、このコードを不必要に変更しないでください

2)バージョン番号-奇妙なことに、最初の3つの番号(major.minor.build)のみが比較に使用されます(これは多くの開発者が犯す一般的な間違いです)

3)製品コード-バージョン番号を変更するとすぐに、VSはこの番号を変更するように求めます-変更します-番号の変更を自動化する場合は、これも忘れずに行ってください

4)DetectNewerInstalledVersion-Trueに設定

5)RemovePreviousVersions-Trueに設定します

個人的には、このような小規模なインストール、つまりVisual Studioで実行できる場合はWiXバージョンでWiXを使用することを検討します

OpenCoverのインストーラーは次のようになります

<Wix xmlns="http://schemas.Microsoft.com/wix/2006/wi" >

<Product Id="*" Name="OpenCover" Language="1033" Version="!(bind.FileVersion.OPENCOVER_FRAMEWORK_DLL)" 
        Manufacturer="OpenCover @ GitHub" UpgradeCode="2250c3f1-d9ba-44d8-b4db-25f91fe92dc6">

    <Package InstallerVersion="200" Compressed="yes" />

    <Upgrade Id="2250c3f1-d9ba-44d8-b4db-25f91fe92dc6">
        <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND" Minimum="1.0.0.0" IncludeMinimum="yes"
                        Maximum="!(bind.FileVersion.OPENCOVER_FRAMEWORK_DLL)" IncludeMaximum="no" />

        <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="!(bind.FileVersion.OPENCOVER_FRAMEWORK_DLL)"
                        IncludeMinimum="yes" />
    </Upgrade>

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

...

</Wix>

上記がお役に立てば幸いです

34
Shaun Wilde

セットアッププロジェクトのプロパティで、バージョン/ビルド番号を変更します。これにより、新しいGUIDの生成を許可するように求められます。これにより、インストーラーに新しいバージョンがあることを通知し、古いバージョンのプログラムを自動的に削除して新しいインストールを許可しますMSIシステムによって。

5
Bueller

上記の手順に従っても、.exeが更新されないという問題もありました。 .exeの製品バージョンは、セットアッププロパティで設定されたバージョン番号に自動的に従っていないようです。新しいインストーラーの実行時に置き換えられる.exeについては、次のように製品バージョンをインクリメントします。

1)[プロジェクトプロパティ]> [アプリケーション]> [アセンブリ情報...]に移動します。

2)アセンブリとファイルのバージョン番号を増やします

3)セットアップを再度ビルドすると、インストールによって古い.exeが上書きされます

これが誰かを助けることを願っています。

4
Wally Cloud

これは古い投稿ですが、答えを探しに来る人のためにこれを追加します。

here に与えられたすべてのことを文字に従って行った後でも、私はこの非常に問題に遭遇しました。私の問題は、C#プログラムのバージョンが、ビルドに関係なくすべてのビルドで増分されないことでした。 AssemblyInfo.csを手動で編集した後でも、生成されたexeのバージョンは1.0.0.0のままです。その結果、セットアップはファイルを置き換えません。

回避策は、セットアッププロジェクトの「XYZプロジェクトからのプライマリ出力」(または上書きしたいもの)ノードに起動条件を追加することです。これにより、新しいセットアップの実行時にインストーラーがファイルを削除します。これで、ユーザーがアプリを起動すると、アプリケーションが構成されていることを示すウィンドウが表示され、新しいファイルがアプリフォルダーにコピーされてアプリが起動します。これは明白な試行錯誤です。私はそれがこのように機能する理由がわかりません(そして、私はこれを理解しようと一晩過ごした後、コーヒーが必要です:))。

  1. セットアッププロジェクトを右クリック>>表示>>起動条件
  2. 「ターゲットマシンの要件」を右クリック>>ファイルの起動条件を追加
  3. ノード(「ファイルの検索1」)が「検索対象マシン」の下に表示され、別のノード(「条件1」)が「起動条件」の下に表示されます。
  4. Search for File1をクリックし、そのFileNameプロパティを既存のものにバインドされているものに変更します(「Notepad.exe」など、ほとんどの場合)。
  5. 「フォルダ」が「[SystemFolder]」に設定され、「プロパティ」が「FILEEXISTS1」に設定されていることに注意してください。
  6. 次に、XYZプロジェクトまたはその他のノードからのプライマリ出力をクリックし、プロパティウィンドウで、[条件]を上記のとおりに「FILEEXISTS1」に設定します。
4
atlantis

AssemblyVersion&AssemblyFileVersionは、@ shaun wildeが言及した他の設定とともにアセンブリ(exe/dll)を上書きするためにインクリメントする必要があります

1
RJN

私も同じ問題を抱えていました。これを確実にする最良の方法は、実行可能ファイルを確認することです。つまり、Application.exe自体が前のバージョンよりも高いバージョンであることを確認します。

(セットアッププロジェクトではなく)プロジェクトのプロパティをクリックし、アプリケーションのバージョンをより高いバージョンに設定します。

0
Mnyikka

回答を少し洗練させて、更新中にWindowsインストーラーが上書きするようにするには、ファイルバージョンをインクリメントする必要があります。これは、一部の人が示したように、アセンブリバージョンをインクリメントすることと必ずしも同じではありません。インクリメントが必要なのはファイルバージョンのみであり、マネージコードでは、AssemblyFileVersionを使用してこれを行います。ファイルバージョンのデフォルトはアセンブリバージョンですが、特定のAssemblyFileVersionに依存するクライアントアセンブリがある場合、AssemblyFileVersionを使用してそれらを異なるものにすることができます。

0
PhilDW

上書きされないファイルで同様の問題がありました。バージョン番号、製品/アップグレードコードなどすべてを確認した。最終的に私を助けたのは MSDNのこの投稿 でした。具体的には、Orcaを使用してmsiファイルを検査する場合の次の部分:

また、> InstallExecuteSequenceテーブルのRemoveExistingProductsのシーケンスを6550から1525に変更しました(InstallExecuteの後> InstallInitializeの後)。

理由はわかりませんが、新しいバージョンが既にインストールされている場合、インストーラーは以前のバージョンのアンインストールを実行しているようです。理由はあるかもしれませんが、アプリケーションを強制的にアップグレードするには、それを変更することが唯一の方法のようでした。

最近のように誰かがこの問題に遭遇した場合、この回避策が役立つことを願っています。

0
Jeremy L