0

WIX インストーラー プロジェクトでは、マネージド カスタム アクション関数で FileA と呼ばれるデプロイ済みファイルに基づいて、新しいファイルを生成する必要があります。これを FileB と呼びましょう。つまり、コンポーネント宣言では、FileA を宣言します。カスタム アクション (コミット フェーズで発生) では、FileA に基づいて FileB を生成する必要があります。その後、FileAはもう使えないので、同じカスタムアクションで削除したいと思います。

ここで問題が発生します。デフォルトのインストール フォルダーである Program Files では、通常のユーザーはカスタム アクションでこのフォルダーにファイルを追加 (FileB を生成) することはできません (私は 100% 正しいと確信していませんが、私のテストではそうでしたが、別のフォルダにインストールしてもまったく問題ありません)。そのため、ファイルを作成する許可を与える必要があると思います。そのために、FileA を含むコンポーネントに CreateFolder 要素を追加します。コンポーネント宣言全体は次のようになります。

<Component Id='COMPONENT_NAME' Guid='MY_GUID'>
    <!--OTHER FILES IN THE COMPONENT-->
    ...
    <CreateFolder Directory='INSTALLDIR'>
      <Permission CreateFile='yes' User='Everyone' GenericAll='yes' Delete='yes'/>
    </CreateFolder>
    <File Id='MyFileA' Name='FileA'   Source='PATH_TO_FILEA' KeyPath='no' >
      <Permission GenericAll='yes' User='Everyone' Delete='yes'/>
    </File>
  </Component>

コンポーネントは、実際には INSTALLDIR に存在するコンポーネント グループに属しています。同じコンポーネント要素に他のファイルがある理由は、FileA を削除しても問題が発生しないように、別の File をキーパスにしたいからです。そして今、FileB の生成は正常に動作しています。しかし、後で同じカスタム アクションで、FileA を削除するときに問題が発生しています。「: パス 'DEPLOYMENT_PATH_TO_FILEA' へのアクセスが拒否されました」とだけ書かれています。問題は FileA 宣言にあると考えたので、File の下の Permission 要素に Delete='yes' を追加し、削除しても問題ないようにしたいと考えました (ただし、これがインストールで可能であることを意味するかどうかはわかりません)。削除する)。しかし、それでもこのエラーが発生します。誰が私が間違ったことを教えてもらえますか?

もう 1 つの質問は、これらの CreatFolder 要素の目的が何なのか本当にわからないということです。1 つには、目的がディレクトリ構造を作成することである場合、(ネストされた)Directory 要素が既にそれを行っていると思います。また、ほとんどの場合、ディレクトリ構造をコンポーネント構造と分離したい場合に、Component 要素の下にそのような要素を配置する理由 (コンポーネントはディレクトリ参照を使用して正しいディレクトリを参照するだけです)。次に、CreateFolder のデフォルトの Directory プロパティは、コンポーネントが存在する親ディレクトリです。しかし、ここにあるように、複数のコンポーネントが同じディレクトリに存在するのが一般的です。複数のコンポーネントが同じコンポーネント グループにあり、そのディレクトリがエレメントは INSTALLDIR を参照します。したがって、これらのコンポーネントの 1 つだけが CreateFolder 要素を持ち、私の場合の Directory プロパティは、これらすべてのコンポーネントの親ディレクトリです。この構造を理解するのは本当に難しいです。CreateFolder 要素について誤解していると思います。誰かが CreateFolder の使い方を教えてくれますか? ありがとう!

ありがとう!

4

1 に答える 1

4

ここで対処すべきいくつかの問題。まず、ロールバックが無効になっている場合、コミット フェーズのカスタム アクションは実行されないことを知っておく必要があります。実際には、遅延およびロールバックのカスタム アクションが必要です。

次に、ファイルをインストールしてから削除するように MSI に指示することはできません。それは逆効果であり、将来的にサービスの問題を引き起こすだけです. より良い解決策 (WiX DTF 管理のカスタム アクションを使用していると仮定しています) は、FileA をコンテンツ アイテムとしてカスタム アクション プロジェクトに含めることです。これにより、実行中のカスタム アクションの現在の (一時) ディレクトリにファイルが存在します。その後、fileb を生成できます。ロールバックの場合、fileb を削除できます。

アンインストール時にファイルを削除するように MSI に指示するには、RemoveFile 要素を作成する必要もあります。それ以外の場合、MSI はプロセス外のカスタム アクションによって作成された fileb について何も知らないため、そうではありません。

それ以外の場合は、fileb の内容を知っておくと便利です。これが fileb としてインストールでき、xml wix 拡張機能を使用して変換できる xml ファイルである場合、実装がより簡単になります。

于 2012-07-05T23:15:32.593 に答える