「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
システムの運用中に、誤ってASP.NETのbinフォルダにDLLファイルをコピーしてしまうなどの問題でシステム障害を発生させてしまうという可能性があるようです。
このため、ココでは、ASP.NETでのbinファイルからのアセンブリ(DLLファイル)読み取りについての仕組みを説明します。
詳細 †
1. はじめに †
- ASP.NET のアセンブリ *1 DLL 読み込みは、
Windows フォームなど他の技術によるアプリケーションのアセンブリ DLL 読み込みとは異なる方式が採用されている。
この点を配慮せず ASP.NET のローカル bin フォルダ内へむやみにアセンブリ DLL を大量登録すると、思わぬ弊害を生じる場合がある。
- ここでは ASP.NET のアセンブリ DLL 読み込み方式と、それにより生じうる弊害などについて説明する。
- 特記なき限り、以下は ASP.NET Web アプリケーション および ASP.NET Web サイト の両方が該当する内容である。
2. ASP.NET 実行開始時点でアセンブリ DLL を読み込むことにより生じうる弊害 †
2.1 既定の場合 †
- ASP.NET のローカル bin フォルダ内に、ASP.NET 環境での動作が想定されていないアセンブリ DLL がコピーされていても、それを ASP.NET から読み込んでしまう。
場合によっては、実行時エラーとなることもある。
- 例) 開発環境専用の (たとえば Visual Studio 自体から使用されること以外を想定していない) クラス ライブラリ
- 例) ASP.NET 以外の環境を前提とする (たとえば Silverlight 専用などの) クラス ライブラリ
- 不必要なものも含む大量のアセンブリ DLL を ASP.NET のローカル bin フォルダ内へコピーしている場合は、その不必要な読み込みにより性能に影響が出るおそれがある。
2.2 読み込み設定を指定し直した場合 †
- 設定次第では、パーサー エラー
*2
やコンパイル エラー
*3 *4
となる。
3. ASP.NET 実行開始時点で読み込む対象のアセンブリ DLL †
3.1 既定の場合 †
- 既定では後述 5.6 の全読込設定が有効なため、以下のアセンブリ DLL 読み込みをする。
- ASP.NET のローカル bin フォルダ内にあるすべてのアセンブリ DLL を読み込む*5。
アセンブリ DLL の対象プラットフォームを問わない。
- 既定値 (後述 5.2) として指定されているアセンブリ DLL を読み込む。
3.2 読み込み設定を指定し直した場合 †
- 全読込設定を後述 5.4 で無効にした上で、後述 5.3 により特定のアセンブリ DLL を指定すると、その指定したアセンブリ DLL のみ読み込む。
たとえ ASP.NET のローカル bin フォルダ内に格納されているアセンブリ DLL であっても、5.3 で記されていないアセンブリ DLL は読み込まない。
4. ASP.NET 実行開始時点の読み込みを終えた後の、アセンブリ DLL 逐次読み込み †
- 3. はアプリケーション実行開始時点で一斉に読み込むアセンブリ DLL の話である。
初期読込完了後はどのようなタイミングであっても、読み込んでいないアセンブリ DLL を必要とした時点で、当該アセンブリ DLL を読み込むことになる。
5. ASP.NET 実行開始時点で読み込むアセンブリ DLL の定義 †
5.1 定義場所 †
5.2 読み込み設定の既定値 †
5.3 読み込むアセンブリ DLL を指定する †
5.4 読み込み設定の既定値をすべて削除する方法 †
5.5 読み込み設定の既定値を個別に削除する方法 †
- 5.2 の設定既定値を一つ一つ削除するには、個別の Web.config にて 5.1 で指定する子要素に <remove assembly="アセンブリ名" /> *12 を記述する。
- 既定のまま後述 5.6 の全読込設定となっている場合に、特定の (ASP.NET のローカル bin フォルダに配置する) アセンブリ DLL を個別に読み込み対象から削除した場合は、当該アセンブリ DLL に限り全読み込みの対象から外れる。
(この場合も、当該アセンブリ DLL を必要とした時点で逐次読み込むのは、4. の通りである。)
5.6 ASP.NET のローカル bin フォルダにあるアセンブリ DLL の全読込設定 †
- 全読込設定は既定値としてあらかじめ指定されているため、原則として指定不要である。
- 5.3 の、アセンブリ名部分にワイルドカード
<add assembly="*" />
を指定 *13 すると、ASP.NET のローカル bin フォルダにあるアセンブリ DLL をすべて読み込む。
6. ASP.NET で読み込むアセンブリ DLL の定義と、ビルドの関係 †
- ここでは Visual Studio 上の「ビルド」操作をしたときのビルド、および IIS 上の動的コンパイルについて記す。
(ASP.NET の事前コンパイルは、ここでは説明の範囲外とする。)
6.1 ASP.NET Web アプリケーションの場合 †
- ソリューション (*.sln) 上でビルドする時点では、コンパイルに必要なアセンブリ DLL が 5.1 での設定から漏れていた場合であってもコンパイル エラーとされない。
(コンパイルそのものは、ASP.NET Web アプリケーションではコード部分のみ実施する。)
- IIS に配置し、それを初めて (またはコンパイル エラーが修正されないまま) ブラウザ等から参照した時点で、コンテンツ ファイル (*.aspx 等) の動的コンパイルが走る。
(コンパイルに必要なアセンブリ DLL が 5.1 での設定から漏れていた場合は、ここでコンパイル エラーになる。)
6.2 ASP.NET Web サイトの場合 †
- ソリューション (*.sln) 上でビルドする時点で、コンパイル エラーに関するチェックがなされる。
(コンパイルそのものは、ASP.NET Web サイトではビルド時に実施しない。)
- コンパイルに必要なアセンブリ DLL が 5.1 での設定から漏れていた場合に、コンパイル エラーとされる。
- IIS に配置し、それを初めて (またはコンパイル エラーが修正されないまま) ブラウザ等から参照した時点で、コンテンツ ファイル (*.aspx 等) の動的コンパイルが走る。
(コンパイルに必要なアセンブリ DLL が 5.1 での設定から漏れていた場合は、ここでもコンパイル エラーになる。)
参考資料 †
ASP.NET のローカル bin フォルダ †
ASP.NET のコンパイルのタイミング †
Tags: :.NET開発, :ASP.NET, :障害対応