DLLの配置場所を変更する(probing, codebase, developmentMode)

.Net アプリケーションは DLL(アセンブリ)をロードする場合、Exe と 同じフォルダ、もしくは、グローバルアセンブリキャッシュ(GAC)を検索します。しかし、probing , codebase, developmentMode といった手法を使用すると検索範囲を拡張したり変更する事ができます。それぞれの手法には特性があり、どのような振る舞いをするのか、適切な利用シーンは何処なのか、検証してみました。


■ probing
プロービングはDLLの検索範囲をサブディレクトリまで拡張する手法です。アプリケーション構成ファイルに以下の様に設定すると DLL サブフォルダまで検索してくれます。











複数のサブディレクトリを指定する場合は、;(セミコロン)で区切ります。以下の指定だとlibサブディレクトリも対象にしてくれます。











アプリケーション構成ファイルは、プログラム名.exe.config という命名規則で exe と同じフォルダに配置しておけば自動的に読み込んでくれます。プログラムのリコンパイルは必要ありません。


probing は、厳密名を持つアセンブリでも持たないアセンブリでも同様に検索対象となります。


■ codebase
コードベースはプロービングと違い特定の DLL の読み込み場所を指定する方法です。probing や developmentMode と違い DLL 毎に指定する必要があります。他の手法がDLLの検索範囲を拡張するのに対し、コードベースは指定の DLL の読込先を変更するという動作になります。


アプリケーション構成ファイルには以下の様に設定します。














ファイルの場所を指し示す href 属性 には、URL や UNC で DLL の場所を絶対パスで指定する必要があり相対パスは指定できません。コードベースは、特定のアセンブリを指定場所からダウンロードして使用するためのものでファイルの配置場所を変更したいという理由のために使うような機能では無いようです。


また、codebase で指定可能なアセンブリは厳密名を持つアセンブリのみで 署名なしのアセンブリは codebase を指定して変更する事はできません。


■ developmentMode
デベロップメントモードは開発者向けの機能で DEVPATH 環境変数に指定したフォルダまでDLLの検索範囲を拡張してくれます。アプリケーション構成ファイルに以下の様に設定すると DEVPATH環境変数で指定したフォルダまで検索してくれます。


MSDNにはマシン構成ファイルと記載されていますが、アプリケーション構成ファイルで問題ありません。また、厳密名を持つアセンブリでも持たないアセンブリでも同様に検索対象となります。









DEVPATH 環境変数に、複数のサブディレクトリを指定する場合は;(セミコロン)で区切ります。


developmentMode は、厳密名を持つアセンブリでも持たないアセンブリでも同様に検索対象となります。また、開発中の簡易的な DLL の検索方法になるので厳密名を持つアセンブリでも 公開キー や バージョンの検証を行いません。


開発者向けの機能ですが上記の特性を理解した上でなら運用時に利用しても問題ないと思います。


★★★★★★★


まとめ。


DLLの配置場所は、Exeと同じフォルダか probing を使ってサブディレクトリに配置するというのが無難です。codebase や developmentMode は、それぞれに目的の用途がありアプリケーションの構成を最初にデザインする際に利用する手法ではありません。リリース後にリコンパイルせずに読み込むDLLを変更したい場合や、開発中だけは厳密名付きのDLLを特定の場所に配置したい場合など利用するシーンが限定されています。