1

Microsoft Shell Control And Automationアプリケーションは、次の場所にあるCOM 参照を使用する必要があります。C:\Windows\system32\shell32.dll

しかし、その参照を追加した後、VS 2010Interop.Shell32.DLLはターゲット ビルド ディレクトリに dll を追加しました。すべて正常に動作しています。ただし、MSI セットアップ ウィザード プロジェクトをビルドする場合。shell32.dll依存関係として追加します。よし、問題ない。

ただし、インストール時に、ターゲット インストール ディレクトリにもコピーshell32.dllされInterop.Shell32.DLLます。アプリケーションを実行すると、奇妙なエラーが表示されます。shell32しかし、インストール ディレクトリから手動で削除すると、すべて正常に動作します。

MSI がshell32.dllインストール ディレクトリにコピーしているのはなぜですか? 64 ビット OS には必要ですか? はいの場合、なぜInterop.Shell32.DLLですか?私のアプリでshell32.dllは問題があるようですが、コピーされないようにする方法はありますか?

編集:

セットアップ プロジェクトから除外shell32.dllしましたが、64bit OS では問題になりますか?

Edit2: shell32.dllatC:\Windows\system32\は実際には 5KB ですが、MSI は 11 MB をコピーします。それは何ですか ?

4

2 に答える 2

2

インストーラーが shell32.dll をコピーしないようにする必要があります。これは、 Windows に常に含まれている重要なオペレーティング システム DLL です。shell32.dll のバージョンが間違っていると、かなり致命的な問題になります。Windows に組み込まれているファイル システム保護機能により、c:\windows\system32 にあるファイル システムが上書きされるのを防ぐことができますが、ローカル コピーがプログラムを台無しにするのを防ぐことはできません。はい、何メガバイトもあり、c:\windows\system32 にインストールされているようにしか見えません。これは実際には実際の場所へのハードリンクであり、c:\windows\winsxs に保存されています。system32 内のほとんどのファイルは、実際にはハード リンクです。それ以外の場合は、悪意のあるインストーラーがオペレーティング システムを破壊するのを防ぐための単純なメカニズムです。

Interop.Shell32.dll アセンブリは、Tlbimp.exe によって生成される相互運用アセンブリです。[ComImport] ディレクティブを含む宣言のみが含まれます。これは、shell32.dll 内のタイプ ライブラリから取得され、同等の .NET 宣言に変換されたものです。タイプ ライブラリ自体を読み取らずに、CLR が RCW を簡単に実装できるようにします。相互運用アセンブリを展開する必要があります。

ここで何が問題になったのかわかりません。インストーラ作成ユーティリティが相互運用アセンブリ用のネイティブ DLL も自動的にコピーするのは正常ではありません。しかし、あなたが介入して、これをやめさせる必要があります。

于 2013-10-22T08:36:19.053 に答える