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 が実行されると、アセンブリが削除されます。インストーラーの観点からは、コンポーネントはまだインストールされていますが、ファイルは失われています。