徒然なるままのブログ。日記とも言う。

2010年11月13日土曜日

GACとカレントディレクトリのアセンブリとWin32DLLと参照順

覚書



・.NETではカレントディレクトリにある.NETアセンブリは第1参照ではない。

 GACが第一参照で、そのあといろいろ検索してそれでもなかったらカレントディレクトリになる。

・アプリケーションが通常のWin32DLLを呼ぶ場合はカレントディレクトリが第1参照になる。



では、exeが呼んでいる.NETアセンブリが内部で更にWin32DLLを呼ぶ場合はどうなるか?

・Win32DLLはexeのカレントディレクトリのものが第一参照となる。



この参照順を変えるためにはアプリケーション構成ファイル(.config)にcodeBaseとして指定してあげれば良い。



で本題

同一の.NETアセンブリの新しいバージョンがGAC登録されていて、古いバージョンがカレントディレクトリにある状態でcodeBaseを正しく指定しているにもかかわらずGACの方を参照してしまう場合はどうしたら良いか?

��この.NETアセンブリは他人作成or買った製品についているものなのでよく解からない)



これはその.NETアセンブリが発行者ポリシーで「下位互換性」を保証していると思われる。それにより新しいバージョンのほうが優先使用されてしまう。

Win32DLLを呼び出す.NETアセンブリが内部でそのWin32DLLのバージョンをチェックして一致していないとエラーを吐きますなんて仕様の場合はorzしてしまう。



対策はアプリケーション構成ファイルのそのアセンブリのエントリ内に

 <publisher policy apply="no" /> 


を記述する。これでそれを無視し、カレントディレクトリのものが使われる。

というか、codebaseとpublisher policy apply="no"はセットで使うと覚えたほうが良いかもしれない。



カレントディレクトリ優先の方がメンド臭くなくてよかったなあ。もしくは.NETでも静的リンクが出来ればいいのに。




0 件のコメント:

コメントを投稿