使用中の共有アセンブリをアンインストールすると、WinSxsが悪い状態のままになります

StackOverflow https://stackoverflow.com/questions/1425411

  •  07-07-2019
  •  | 
  •  

質問

WinXPでWix3を使用して共有win32 SxSアセンブリをアンインストールするのに問題があります。私のwixファイルは、 http://n2.nabble.com/Tutorial-How-to-install-files-into-WinSxS-td841475.html

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

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

  

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

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

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

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

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

役に立ちましたか?

解決

私はこの同じ問題にぶつかると思う何かに取り組んでいます。

この時点での私の仮定は、I <!>#8217; dをHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations regkeyからの小さなmojoと、おそらくファイル許可スマッキング(ファイルがまだロックされている場合)で解決する必要があるということです。

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

もちろん、インストーラーでは、キーの存在を確認し、キーがなくなるまでインストールをブロックできます。 (つまり、<!> quot;再起動が必要です<!> quot;)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top