1

WinXP で Wix3 を使用して共有の win32 SxS アセンブリをアンインストールできません。私の wix ファイルは、http://n2.nabble.com/Tutorial-How-to-install-files-into-WinSxS-td841475.htmlで説明されているものとほとんど同じです。

問題は、アセンブリのモジュールが使用されている場合、アンインストーラーは成功エラーコードで完了しますが、アセンブリは壊れた状態のままになります。マニフェストとセキュリティ カタログは削除されていますが、アセンブリ ディレクトリには dll が含まれています。 . DLL は再起動後も存続するため、削除対象としてマークされることはありません。MSI ログ ファイルに明らかなエラーはありません。

パッケージを再インストールしようとすると、アセンブリのインストールがスキップされます。コンポーネントが登録されていないため、インストーラーにアンインストールを再試行させることができません。以降のインストールでは、msi ログに次のように表示されます。

MSI (c) (98:44) [11:46:56:263]: アセンブリ コンポーネントのインストールをスキップしています: {26A273E7-7F9A-4F77-9FA8-5E413A155BEC} アセンブリが既に存在するため

アセンブリのディレクトリを手動で削除する以外に、SxS を良好な状態に戻す方法が見つかりません。この時点で、アセンブリのディレクトリは XP システムの復元によって保護されなくなりました。

私の実際のインストーラーははるかに複雑ですが、単一のコンポーネントを含む単一の機能を持つ非常に基本的なインストーラーでこれを再現できました。そのコンポーネントには、dll、マニフェスト、およびセキュリティ カタログが含まれています。dlls <File> 要素には、KeyPath、Assembly、および AssemblyManifest 属性が設定されています。インストールしたら、MSVS で DLL を開いて、アセンブリをロードするプロセスをシミュレートできます。

この状況を検出して防止するために、アンインストール時に呼び出す必要がある追加のアクションはありますか? または、WinSXS に DLL が既に存在する場合でも、インストール操作を強制的に実行する方法はありますか?

多少関連していますが、アセンブリが変更されていない場合に、アセンブリをインストールしたパッケージをアップグレードしようとすると、問題が発生します。インストーラーは、アセンブリを再インストールする必要はないと判断しますが (アセンブリは変更されていないため)、SxsUninstallCA が実行されると、アセンブリが削除されます。インストーラーの観点からは、コンポーネントはまだインストールされていますが、ファイルは失われています。

4

1 に答える 1

2

私は、この同じ問題に遭遇すると信じていることに取り組んでいます。

この時点での私の仮定は、これをHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperationsレジストリキーからのちょっとしたモジョで解決しなければならないということです。

もちろん、再起動が必要です。

もちろん、インストーラーでキーの存在を確認し、キーがなくなるまでインストールをブロックすることもできます。(つまり、「再起動する必要があります」)。

于 2009-09-29T22:58:33.450 に答える