現象
DLL のリダイレクションを制御する ".local" ファイルを配置した状態でアプリケーションを実行し、DLL の読み込みを行った場合、その後、".local" ファイルを削除しても、DLL の検索パスは ".local" が存在していたときと同じものが使用されます。
原因
Windows Vista 以降の OS では、アプリケーションが最初に起動するとき、「プログラム互換性アシスタント」で設定した情報と共に、 サイド バイ サイド の情報を保持し、2 回目以降の起動では、キャッシュされた情報を利用します。
このとき、 1 回目の 起動で ".local" ファイルが存在していた場合、その情報はキャッシュされ、 2 回目以降の起動ではキャッシュされた情報を利用されます。
ここで、".local" ファイルを削除してもキャッシュ情報は更新されないため、2 回目以降の起動は、".local" ファイルがあるかのように DLL がロードされます。
回避策
アプリケーション起動時に作成されるキャッシュ情報は更新・削除されることはないため、次のいずれかの対応策を行うことで、意図した DLL の読み込みを行うことができます。
・不要な DLL を削除する。
意図しない DLL を読み込まないように 不要な DLL を削除します。
・exe ファイルを更新する。
キャッシュ内容が更新されます。
・異なるフォルダを利用する。
キャッシュは、フルパスの情報を保持するため、フォルダ名を変えることにより異なるキャッシュが利用されます。
・最初の起動時から ".local" ファイルを削除する。
キャッシュに ".local" ファイルの存在が保持されません。
・レジストリ DevOverrideEnable を設定する。
キャッシュを利用せず毎回 ".local" ファイルの確認を行います。
DevOverrideEnable の設定手順
=========================
1) レジストリエディタを起動します。
2) Image File Execution Options キーを マウスの右ボタンで選択します。
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
3) 「新規」を選択して、 REG_DWORD を選択します。
4) 名前に DevOverrideEnable を入力します。
5) 値に 1 を入力します。
6) レジストリエディタを終了させます。
7) OS を再起動させます。
状況
この動作は、本技術情報の対象となる Windows OS の仕様です。