2

製品Aと製品A'があります。それらはほぼ同一であり、簡単に混乱します。法的な理由から、これらを微妙に異なるものに保つ必要があります。技術的な理由により、この2つを共存させて正しく実行することはできません。したがって、製品A'がすでにインストールされている場合はユーザーが製品Aをインストールできないようにし、その逆も同様です。

Windowsでこれを実施するためのベストプラクティスはありますか?

私の最初の考えは、製品AとA'に異なるアップグレードコードを使用し、これを使用して、もう一方がインストールされていることを手がかりにすることですが、他のアプローチやベストプラクティスがあると確信しています。

4

3 に答える 3

3

カスタムアクションを使用して、インストールされている製品のリストを列挙できます。

//using using Microsoft.Deployment.WindowsInstaller;

IEnumerable<ProductInstallation> installedProducts = ProductInstallation.GetProducts(null, null, Microsoft.Deployment.WindowsInstaller.UserContexts.Machine);
foreach (ProductInstallation installedProduct in installedProducts)
    {
        if (installedProduct.ProductName == "Name of Product A'")
        {
            // set some property in your installer to indicate the product can't be installed
        }
    }
于 2012-11-01T15:41:04.470 に答える
3

Windowsインストーラパッケージの開発者は、条件ステートメントでプロパティを使用することにより、カスタムアクションに頼ることなくこれを実行できると思います。

LaunchConditionsアクションは、 LaunchConditionテーブルを照会し、そこに記録されている各条件ステートメントを評価します。これらの条件ステートメントのいずれかが失敗すると、エラーメッセージがユーザーに表示され、インストールが終了します。

LaunchConditionsアクションは通常、シーケンスの最初ですが、AppSearchアクションはLaunchConditionsアクションの前にシーケンスされる場合があります。

AppSearchアクションは、ファイル署名を使用して、製品の既存のバージョンを検索します。AppSearchアクションを使用して、レジストリまたは.iniファイルエントリの既存の値にプロパティを設定することもできます。

インストーラーが提案された場所でファイル署名を初めて検出すると、このファイルまたはディレクトリの検索を停止し、対応するプロパティをAppSearchテーブルに設定します。そのプロパティは、LaunchConditionテーブルのConditionalStatementSyntaxを使用して評価できます。

于 2012-11-02T17:36:43.797 に答える
2

以前は行ったことがありませんが、解決策は、製品A(またはA')を(初めて)インストールするときにWindowsレジストリにKey-Valueを保存することです。

A(またはA')のインストーラーが実行されるたびに、そのキーが存在するかどうかがチェックされ、trueの場合はインストールが中止され、そうでない場合はインストールが続行されます。ユーザーが製品をアンインストールした場合は、レジストリのキーも削除することを忘れないでください。

Windowsレジストリの詳細については、http://en.wikipedia.org/wiki/Windows_Registryを参照してください。

キーの追加、編集、削除については、http ://support.microsoft.com/kb/310516を参照してください。

于 2012-11-01T14:24:59.793 に答える