1

私の問題:

2つのマージモジュールを作成しました。それらをAおよびBと呼びましょう。マージモジュールBはAに依存しています。Aはaaa.dllをウィンドウに並べてインストールします。Bには、インストール中に登録され、aaa.dllに依存するbbb.dllが含まれています。補足として、マージモジュールAはInstallshield 2012で作成され、マージモジュールBはVisualStudio2010ウィザードを使用して作成されました。

両方のマージモジュールをインストールするインストールシールドプロジェクトがあります。[アプリケーションデータ]->[再配布可能ファイル]に移動し、インストールにBを追加します。これにより、Aが自動的にチェックオフされます。[Organization]-> [Setup Design]に移動し、Bを含む機能を展開すると、[B]をクリックします。Bに関する情報が表示されたウィンドウが表示されます。そこに、Aを正しくリストする[Dependencies]見出しがあります。

プロジェクトをビルドして、クリーンなVMにインストールしようとしています。インストール中に、bbb.dllの登録に失敗したというエラーが表示されます。無視してキャンセルします。この時点で、マシンのwinsxsを調べたところ、aaa.dllが適切なフォルダーに存在しないことがわかりました。むしろ、winsxs \InstallTemp\サブフォルダーに存在します。次に、エラーポップアップで[無視]をクリックすると、インストールはそれ以上エラーなしで続行されます。次に、完了後、bbb.dllを手動で正常に登録でき、aaa.dllは適切なwinsxsサブフォルダーに存在します。

私の質問は、マージモジュールAを完全に終了させ、aaa.dllを正しい場所に配置して、すべてが正しくインストールされるようにするにはどうすればよいですか?

私が試したこと:

  1. InstallShieldプロジェクトのOrganization->SetupDesignで複数の機能を作成してみました。そこで、3つの機能を作成しました。上部の機能1にはAが含まれています。機能2にはAが含まれ、次にBが含まれています。最後に機能3にはAが再び含まれています。3つの機能すべてを必須にしました。これにより、機能全体のインストールが完了し、aaa.dllが正しい横に並んだ場所に配置されることを期待していました。しかし、そのような運はありません。(順序が逆になっている場合に備えて、3つの機能を作成しました)
  2. 問題は、aaa.dllが時間内または適切な場所にインストールされていないことだと確信しています。これをテストするために、最初にマージモジュールAをインストールしたインストールシールドインストーラーを使用してaaa.dllをインストールしようとしました。次に、メインインストーラーを実行すると、すべてが機能しました。

テキストの壁と不適切な文法\スペルでごめんなさい。本当にイライラするので、誰か他の人が最終的にこの問題に遭遇した場合に備えて、自分で問題を見つけたら投稿します。

4

1 に答える 1

3

WinSXSおよびGACを対象とするファイルは、それらを公開するAPIがロールバック操作をサポートしていないため、コミットフェーズの実行まで実際にはインストールされません。これは、WinSxSに送られるファイルに依存するDLLで自己登録を使用している場合、競合状態があるために機能しないことを意味します。B.DLLは、DllRegisterServerを呼び出すときにA.DLLに対してLoadLibrary()を実行しようとしますが、検出されません。

いくつかの回避策:

1)自己登録は使用しないでください。ベストプラクティスとして、設計時またはビルド時にCOMデータを抽出します。

2)INSTALLDIRなどの別のディレクトリにA.DLLを展開します。

3)A.DLLを独自のMSIにラップし、セットアップの前提条件としてMSIに接続します。これにより、MSIのインストールを開始する前に、Aが独自のトランザクションにインストールされます。

于 2011-10-13T01:38:30.813 に答える