bugfix> c# > 投稿

ユーザーが手動で実行するmsiファイルを用意します。ほとんどの場合、インストールディレクトリを選択できる必要がありますが、特定のインストール場所を禁止する必要があります。例えば。ルートディレクトリ C:\ にインストールするあらゆる種類の問題が発生するため、その決定を上書きする必要があります(つまり、 C:\ を上書きします C:\Program Files (x86)\xxx と )またはエラーでポップアップします。これを強制する方法はありますか?

問題のmsiには既にカスタムアクションがありますが、そこからインストール場所を編集する方法はないようです。

また、この場合のmsiはWiXバンドルにラップされているため、そこから特定のディレクトリを禁止できる場合は、それも有効です。ただし、これを行う方法も見つかりません( <Variable Name="InstallFolder" ...> でデフォルトを編集する方法のみを知っています) )

私が考えることができる他の解決策だけがかなり恐ろしいでしょう:許容可能なディレクトリでインストーラを実行するディレクトリを選択する別のアプリケーションを作成します。

これは、msiまたはWiXバンドルを介して実行できますか?

「Visual Studio 2013 Installer Projects」拡張機能を使用して、msiをビルドしています。

回答 3 件
  • 逆の見方として:

    一般的に、これは悪い考えです。ほとんどの場合、正しい答えは、アプリケーションコードを適切なProgram Filesフォルダー(64ビットまたはx86)にインストールし、データファイルをデータの場所などにインストールすることであり、ユーザーは選択の余地がありません。 (たとえば)Windows認定規則で、コードはProgram Filesの場所に移動する必要があると言われているので、選択するのが良い考えであることは私には明らかではありません。ユーザーは単にインストールされたアプリケーションが正しく動作することを気にし、いくつかの場所にインストールしたときに失敗した場合、1)アプリケーションが動作するように修正するか、2)Program Filesを使用してユーザーに選択肢を与えないかのどちらかです。

    また、Visual Studio Installerプロジェクトを使用している場合は、インストール場所を変更するには遅すぎるため、カスタムアクションを作成することはできません。あなたはすでにこれを発見したようです。ただし、フォルダの参照ダイアログを非表示にして、デフォルトの正しい場所にインストールできます。

    もう1つの問題は、「許可された」場所をどのように定義するかが明確でないことです。 C:\ではない場合、D:\ SomeOtherLocationになりますか?接続されたUSBドライブにできますか? \\ Servername \ shareなどのネットワーク共有にできますか?ネットワーク共有へのマッピングされたドライブ?実行時にインストールまたはアプリが失敗する選択された場所がいくつもある可能性があり、許可されているものの有用なリストがあるとは思わない。その上で、32ビットのインストールがあり、ユーザーが64ビットシステムでネイティブのProgram Filesフォルダーを選択すると、そこにも行かない-Program Files(x86)にリダイレクトされますロケーション。最後に、ユーザーがコマンドラインで場所を指定し、テストに失敗し、インストールがサイレントに失敗すると仮定すると、サイレントインストールモードで何をするのか明確ではありません(サイレントはサイレントを意味し、インストールが無人になる可能性があるため)。

    つまり、Program Filesにインストールするだけで完了です。

  • カスタムアクション:これは短くなります。後で確認します。私は最近これを実装することに煩わされたとは言えませんが、カスタムアクションは確かにインストール場所を検査し、セットアップを中止または停止することができます-選択されたパスが満足のいくものではない場合。また、MSIは C:\ のルートへの直接インストールに積極的に抵抗することに注意してください  Directoryテーブルの実装方法に起因するそのようなもの。

    GUI:ユーザーが Next をクリックしたときにカスタムアクションを実行する方法があると思います  セットアップの宛先パスカスタマイズダイアログのボタンをクリックします。このボタンは、パスのチェックに関して「必要なことは何でも」を実行し、エラーを報告します。これには DoAction event が含まれます   OK にフックアップ  または Next  パスカスタマイズダイアログのボタン。

    サイレントモード:同じカスタムアクションをフックしてサイレントモードで実行することもできます(または同じパスチェック機能を呼び出す別のカスタムアクション)-サイレントインストールに望ましくないパスも指定される可能性があることを考慮します。その場合、カスタムアクションは、パスの問題をユーザーに報告する代わりに、ログファイルに書き込んだ後にセットアップを中止する必要があります-これは、上記のダイアログイベントから行うことです-明らかに。

    Github:このコンピューターで利用可能なWiXコードがありません。私はgithub.comにアクセスして、WiXを使用する他のプロジェクトを検索します-おそらくすぐに何かを見つけるでしょう-無料でお金がなく、WiXは無料です。

  • ユーザーが手動でインストールできる(つまり、UIシーケンスを使用する)ことに基づいて、次のことが簡単になります。

    InstallUISequenceで、LaunchConditionアクションをExecuteActionアクションの直前にシーケンスします。

    次に、LaunchConditionテーブルで、次のような条件を追加します。

    調子: TARGETDIR〜<<"C:\ Program Files \"

    説明: Program Filesフォルダーにインストールする必要があります

    条件で私たちが言っていることは:

    TARGETDIRが「C:\ Program Files \」で始まる場合(したがって、ユーザーはこのフォルダーの下のどこにでもインストールできます)、インストールを続行します。それ以外の場合はエラーをスローします。

    特定の場所を防止するのではなく、ベストプラクティスとしてProgram Filesフォルダーを強制するだけでしょう。

あなたの答え