2011-06-06 15 views
6

私のアプリケーション用のWindowsインストーラがあります。アプリケーションパッケージには、カスタムアクションで実行されるアクションのいくつかが実行されるインストーラークラスも含まれます。Windowsインストーラによるアプリケーションのインストールに関する問題

インストーラーは、インストール時にカスタムアクションから別のアプリケーションをインストールします。このアプリケーションが既にインストールされているか、Y/Nを再インストールするためのメッセージボックスをインストールしたくないという同じバージョンのアプリケーションが既に存在するかどうかを知りたいです。

私のアプリケーションが既にインストールされていて、同じインストーラをもう一度クリックすると、「修復」と「削除」オプションが表示されます。しかし、インストーラが新しくビルドされている場合は、「別のバージョンが既にインストールされています...プログラムの追加と削除を使って削除します」というダイアログが表示されます。だから私はそれをアンインストールせずに既存のバージョンを更新することはできません。既存のバージョンを更新するにはどうすればよいですか?

これらの2つのクエリに関するヘルプやガイダンスは高く評価されています。私はこれらのためにネットで見たが、適切な答えを得ることができませんでした。あなたが私を助けることができれば、それは本当に素晴らしいでしょう。

CODE

prouct.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" 
ProductCode="My.Bootstrapper.ABC"> 

<!-- Create Package, Product Manifest http://msdn.microsoft.com/en-us/library/ee335702.aspx 
    Schema Reference : http://msdn.microsoft.com/en-us/library/ms229223.aspx 
    --> 

<PackageFiles> 
    <PackageFile Name="XYZ.exe"/> 
</PackageFiles> 

<InstallChecks> 
    <!-- If its installed, it will be in Uninstall. DisplayName will be XYZ2.1_rc22 
    Can still get values of DisplayVersion (2.1_rc22) & UninstallString from this key 
    --> 
    <RegistryCheck 
     Property="IS_XYZ_INSTALLED" 
     Key="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\XYZ" 
     Value="DisplayName"/> 
    </InstallChecks> 

    <Commands> 
    <Command PackageFile="XYZ.exe" Arguments="/Install"> 
    <InstallConditions> 
     <BypassIf Property="IS_XYZ_INSTALLED" 
      Compare="ValueEqualTo" Value="XYZ2.1_rc22"/> // tHIS IS THE DISPLAYNAME, THAT I SEE IN REGISTY 
     <FailIf Property="AdminUser" 
      Compare="ValueNotEqualTo" Value="True" 
      String="NotAnAdmin"/> 
    </InstallConditions> 

    <ExitCodes> 
     <ExitCode Value="0" Result="Success"/> 
     <ExitCode Value="1641" Result="SuccessReboot"/> 
     <ExitCode Value="3010" Result="SuccessReboot"/> 
     <DefaultExitCode Result="Fail" String="GeneralFailure"/> 
    </ExitCodes> 
    </Command> 
</Commands> 

</Product> 

のpackage.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Package xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" 
    Name="DisplayName" Culture="Culture"> 

<!--Check for XYZversion 2.1_rc22 --> 
<Strings> 
    <String Name="DisplayName">Install My XYZ</String> 
    <String Name="Culture">en</String> 
    <String Name="NotAnAdmin">Administrator permissions are required to install XYZ.Contact your 
       administrator.</String> 
    <String Name="GeneralFailure">A general error has occurred while installing this 
      package.</String> 
    </Strings> 
</Package> 

UPDATE:それはaleradyにインストールされていない場合、私はXYZをインストールしたい PC。上記のコードでは、前提条件としてインストールされません。前提条件で私のアプリケーションを選択し(Windows Installer 3.1 & .NET3.5)、「自分のアプリケーションと同じ場所からprereqをダウンロードする」を選択しました。セットアッププロジェクトのビルド時に、Relに3つのフォルダがあります(winInsの場合、&私のアプリは事前にXYZとしてインストールされています)。現時点では、私のコンピュータにはXYZがインストールされていないので、キーは見つかりません。インストーラをインストールすると、アプリがインストールされますが、プリインストール(XYZ.exe)アプリケーションはインストールされません。どこが間違っていますか?

ありがとうございました。

+0

カスタムアクションに他のアプリケーションをインストールするには、別のMSIですか? – Jodrell

+0

@ Jodrell、他のアプリケーションはWindowsインストーラファイルです。カスタムアクションでは、インストールの下にそのフィールを追加しました。したがって、インストールプロセス中に実行され、exeファイルが他のアプリケーションをインストールします。 – Tvd

答えて

0
  1. あなたがGetFileVersionInfoVerQueryValue WinAPIの関数を使用して実行可能ファイルのバージョンを確認することができます(.NET対応がなければなりません)。

  2. ProductCodeは、MSIパッケージを生成するたびに変更できます。アップグレードには現在のバージョンが含まれている必要があります。つまり、ProductVersionを変更せずに、同じバージョンのパッケージ間でアップグレードを許可する必要があります。

    は、Cosmin's recommendationの後にをお勧めします。


更新:コメントに答えます。

<Upgrade Id="Your-Upgrade-GUID"> 
    <UpgradeVersion Minimum="$(var.ProductVersion)" 
        IncludeMinimum="no" 
        OnlyDetect="yes" 
        Language="1033" 
        Property="NEWPRODUCTFOUND" /> 
    <!-- NEWPRODUCTFOUND property is set if a newer product version 
     is installed. It is used to prevent downgrades. --> 

    <UpgradeVersion Minimum="1.0.0" 
        IncludeMinimum="yes" 
        Maximum="$(var.ProductVersion)" 
        IncludeMaximum="yes" 
        Language="1033" 
        Property="UPGRADEFOUND" /> 
    <!-- UPGRADEFOUND property is set if older product version is installed 
     or the same as the value of ProductVersion variable --> 
</Upgrade> 

上記のコードを使用して、同じバージョンのアプリケーション間でもアップグレードを実行します。 ProductVersionは、現在のバージョンの製品を含むWiXプリプロセッサ変数です。 PackageCodeは、ビルドごとに自動的に生成され、*を.wsxファイルの値として使用します。

第2のUpgradeVersion要素の属性がIncludeMaximum="yes"であり、生成された各パッケージに一意のPackageCodeという要素があることが重要です。

+0

@Alexey、どうやってアップルのアップグレードを処理できますか?アップグレードの製品コードまたはバージョンも変更する必要がありますか?そしてそれがアップグレードであれば、インストールされたパスは自動的に変更されないようになります。どのようにインストーラでそれを取得するには?インストーラクラスもあります。 – Tvd

+0

@Tvd、製品バージョンを更新せずに現在のバージョンのインストールをアップグレードできるWiXコードスニペットを提供しています。 –

+0

@alexey、ありがとう。しかし、私はVS 2008を使ってSEtu&Deploymentを使用してWindowsインストーラを使用します。セットアップ&デプロイメントプロジェクトで同じことをどうやって行うのですか?あなたがCosminsの提案をお勧めするので、Cosminの回答の下にコードと私のコメントを追加してください。または上記のSetup&Deployment windows installer MSIでの処理方法。本当に感謝します。 – Tvd

3

インストール時に、カスタムアクションから別の アプリケーションがインストールされます。この アプリケーションがすでに存在するかどうかを知りたい場合は バージョンをインストールしたくない場合や、 にメッセージボックスを指定する場合 Y/Nを再インストールしてください。

カスタムアクションの代わりに、前提条件を使用する必要があります。 Visual Studioセットアッププロジェクトを使用している場合は、おそらくこれが役立ちます。Adding Custom prerequsites to visual studio setup project

別のセットアップオーサリングツールを使用している場合は、前提条件がサポートされているかどうかを確認する必要があります。

私のアプリケーションが既にインストール ある、と私は再び同じ インストーラをクリックした場合、私は、「修復」を取得し、 オプションを「削除」。しかし、インストーラ が新たにビルドされた場合は、 "別のバージョンが既にインストールされています ...ダイアログを削除します。削除の追加を削除するには プログラム.."を選択してください。そのため、 をアンインストールせずに存在するバージョンを に更新することはできません。既存の バージョンを更新するにはどうすればよいですか?

これは、ProductVersionを増やしたり、ProductCodeを変更せずにパッケージを変更したために発生します。自動アップグレードが必要な場合は、それらを変更する必要があります。

ただし、テストするだけで、ProductVersionを増やしたくない場合は、新しいパッケージをインストールする前に古いパッケージを手動でアンインストールする必要があります。これはWindows Installerのアップグレード方法です。

+0

@ Cosmin、私はどのように/私のアプリでブートストラップマニフェストを設定することができません。私はWindowsインストーラを使用しています。私のアプリケーション名は "ABS.exe"で、私がインストールしている他のアプリケーションは "XYZ.exe"です。システムは元のフルバージョンを持つかもしれません。私のビルドされたアプリケーションのexeファイル名は、元のフルバージョンのexeファイル名と同じです。私はインストールされたパスからファイルとフォルダの名前を識別することで、自分のビルドされたバージョンを認識します。このコンプレックスでは、カスタムPrerequsitesの使用方法を理解できません。あなたは私を助けてくれますか?私はすべてのことで迷っていると思う。 – Tvd

+0

@Cosmin、REG "別のバージョンが既にインストールされています..."これをどうにか処理しますか?つまり、そのシステムメッセージの代わりにカスタムメッセージを与えることができます。もしそうなら、これを処理することができますか?この部分をどのように扱いますか? – Tvd

+0

私はあなたの他のアプリケーションが異なるインストーラを持っていることを前提としていました。この場合、2番目のインストーラを前提条件として追加することができます。両方のアプリケーションで単一のパッケージを使用している場合は、なぜカスタムアクションからインストールするのですか?メッセージに関しては、メッセージを変更したり処理したりすることはできません。バージョンを増やして製品コードを変更するか、古いバージョンを手動でアンインストールします。 –

関連する問題