「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>ASP.NET]]

* 目次 [#da5fb260]
#contents

*概要 [#ja2b0475]
システムの運用中に、誤ってASP.NETのbinフォルダにDLLファイルをコピーしてしまうなどの問題でシステム障害を発生させてしまうという可能性があるようです。~
このため、ココでは、ASP.NETでのbinファイルからのアセンブリ(DLLファイル)読み取りについての仕組みを説明します。

*詳細 [#x0a8a3ef]

** 1. はじめに&aname(P100); [#a654ed78]
- ASP.NET のアセンブリ ((.NET Framework 環境で動作する、EXE・DLL の各実行ファイルをアセンブリと呼ぶ。&br;   ここではクラス ライブラリ等として使用する DLL ファイルが対象である (EXE ファイルは対象外である) ため、「アセンブリ DLL」と表記する。)) DLL 読み込みは、~
Windows フォームなど他の技術によるアプリケーションのアセンブリ DLL 読み込みとは異なる方式が採用されている。~
この点を配慮せず ASP.NET のローカル bin フォルダ内へむやみにアセンブリ DLL を大量登録すると、思わぬ弊害を生じる場合がある。
- ここでは ASP.NET のアセンブリ DLL 読み込み方式と、それにより生じうる弊害などについて説明する。
- 特記なき限り、以下は ASP.NET Web アプリケーション および ASP.NET Web サイト の両方が該当する内容である。

** 2. ASP.NET 実行開始時点でアセンブリ DLL を読み込むことにより生じうる弊害&aname(P200); [#l528f65a]

*** 2.1 既定の場合&aname(P210); [#wd93838d]
- ASP.NET のローカル bin フォルダ内に、ASP.NET 環境での動作が想定されていないアセンブリ DLL がコピーされていても、それを ASP.NET から読み込んでしまう。~
場合によっては、実行時エラーとなることもある。
-- 例) 開発環境専用の (たとえば Visual Studio 自体から使用されること以外を想定していない) クラス ライブラリ
-- 例) ASP.NET 以外の環境を前提とする (たとえば Silverlight 専用などの) クラス ライブラリ
- 不必要なものも含む大量のアセンブリ DLL を ASP.NET のローカル bin フォルダ内へコピーしている場合は、その不必要な読み込みにより性能に影響が出るおそれがある。


*** 2.2 読み込み設定を指定し直した場合&aname(P220); [#p30c4ec6]
- 設定次第では、パーサー エラー
((当該 Web アプリケーション自身または当該 Web サイト自身のアセンブリ DLL を指定しなかった場合は、ASP.NET コンテンツ (*.aspx 等) の閲覧時にパーサー エラーとなる。&br;    「パーサー エラー メッセージ: 型 '『名前空間の名称』.Global' を読み込めませんでした。」))
やコンパイル エラー
((既定の定義である&br;      %&#x53;ystemRoot%\Microsoft.NET\Framework\『バージョン番号』\Config\web.config&br;   の&br;      <system.web><pages><namespaces>《あらかじめインポートする名前空間の定義》</namespaces></pages></system.web>&br;   で指定されている名前空間によっては、それに対応するアセンブリ DLL を ([[5.3>#P530]] により) 明示的に読み込まないと、ASP.NET コンテンツ (*.aspx 等) の閲覧時にコンパイル エラーとなる場合がある。&br;    「コンパイル エラー メッセージ: CS0234: 型または名前空間名 'yyyyy' は名前空間 'xxxxx' に存在しません。アセンブリ参照が不足しています。」)) ((たとえば既定で以下の名前空間が指定されている場合は、それに対応するアセンブリ DLL を明示的に読み込む指定をする必要がある。&br;   (使用しない名前空間の場合は、各 Web アプリケーション (または各 Web サイト) の web.config で、<remove namespace="『名前空間の名称』" /> にて指定を解除する方法もある)&br;      ・<add namespace="System.Linq" /> が指定されている            → アセンブリ System.Core の読み込み設定が必要&br;      ・<add namespace="System.Web.&#x44;ynamicData" /> が指定されている → アセンブリ System.Web.Extensions  の読み込み設定が必要&br;      ・<add namespace="System.Xml.Linq" /> が指定されている        → アセンブリ System.Xml.Linq の読み込み設定が必要))
となる。

** 3. ASP.NET 実行開始時点で読み込む対象のアセンブリ DLL&aname(P300); [#dbb40aac]

*** 3.1 既定の場合&aname(P310); [#x58d83e0]
- 既定では[[後述 5.6>#P560]] の全読込設定が有効なため、以下のアセンブリ DLL 読み込みをする。
-- ASP.NET のローカル bin フォルダ内にあるすべてのアセンブリ DLL を読み込む((MSDN ライブラリ「ASP.NET Web サイト内の共有コード フォルダ」&br;   [[https://msdn.microsoft.com/ja-jp/library/t990ks23(v=vs.100).aspx>https://msdn.microsoft.com/ja-jp/library/t990ks23(v=vs.100).aspx]] &br;     >Bin フォルダのアセンブリは登録する必要がありません。&br;     >Bin フォルダに .dll ファイルが存在するだけで、ASP.NET は認識できます。))。~
アセンブリ DLL の対象プラットフォームを問わない。
-- 既定値 ([[後述 5.2>#P520]]) として指定されているアセンブリ DLL を読み込む。

*** 3.2 読み込み設定を指定し直した場合&aname(P320); [#g17088bb]
- 全読込設定を[[後述 5.4>#P540]] で無効にした上で、[[後述 5.3>#P530]] により特定のアセンブリ DLL を指定すると、その指定したアセンブリ DLL のみ読み込む。&br;たとえ ASP.NET のローカル bin フォルダ内に格納されているアセンブリ DLL であっても、[[5.3>#P530]] で記されていないアセンブリ DLL は読み込まない。

** 4. ASP.NET 実行開始時点の読み込みを終えた後の、アセンブリ DLL 逐次読み込み&aname(P400); [#qc323951]
- [[3.>#P300]] はアプリケーション実行開始時点で一斉に読み込むアセンブリ DLL の話である。~
初期読込完了後はどのようなタイミングであっても、読み込んでいないアセンブリ DLL を必要とした時点で、当該アセンブリ DLL を読み込むことになる。

** 5. ASP.NET 実行開始時点で読み込むアセンブリ DLL の定義&aname(P500); [#o4ea5be3]

*** 5.1 定義場所&aname(P510); [#hc226b3f]
- [[Web.config>.NET config#u3d1af27]] の~
- [[Web.config>#nf687ad7]] の~
 <system.web>
     <compilation>
         <assemblies>
             ★★★
         </assemblies>
     </compilation>
 </system.web>
にある <assemblies></assemblies> ((MSDN ライブラリ「compilation の assemblies 要素 (ASP.NET 設定スキーマ)」&br;   https://msdn.microsoft.com/ja-jp/library/bfyb45k1.aspx)) の子要素として、★★★ に定義する (要素数は 0個以上)。
-なお、この定義は本来コンパイルで使用されるコンパイル設定値 ((MSDN ライブラリ「compilation 要素 (ASP.NET 設定スキーマ)」&br;   https://msdn.microsoft.com/ja-jp/library/s10awwz0.aspx )) に分類されているが、実際はコンパイルに限らずアプリケーション実行開始時点でも使用される。

*** 5.2 読み込み設定の既定値&aname(P520); [#v2808179]
- [[5.1>#P510]] の定義を省略した場合や、[[5.1>#P510]] で指定すべき子要素の個数が 0 の場合は、既定値として~
 %SystemRoot%\Microsoft.NET\Framework\『バージョン番号』\Config\web.config
 (※『バージョン番号』は、アプリケーションの使用ランタイムに依存する。)
にある~
 <system.web><compilation><assemblies>★★★</assemblies></compilation></system.web>
の設定内容が適用される((MSDN ライブラリ「compilation の assemblies 要素 (ASP.NET 設定スキーマ)」&br;   https://msdn.microsoft.com/ja-jp/library/bfyb45k1.aspx &br;   の「次の既定の assemblies 要素は、ルートの Web.config ファイルで構成されます。」))。

*** 5.3 読み込むアセンブリ DLL を指定する&aname(P530); [#p6a20a12]
- [[5.1>#P510]] に~
 <add assembly="アセンブリ名" />
と指定 ((MSDN ライブラリ「compilation の assemblies の add 要素 (ASP.NET 設定スキーマ)」&br;   https://msdn.microsoft.com/ja-jp/library/37e2zyhb.aspx )) ((指定するのはアセンブリ名であり、アセンブリ DLL ファイル名ではない。)) されたアセンブリ DLL が、読み込み対象となる。

*** 5.4 読み込み設定の既定値をすべて削除する方法&aname(P540); [#v38fb5b9]
- [[5.2>#P520]] の設定既定値を全部削除するには、個別の web.config にて [[5.1>#P510]] で指定する子要素の冒頭に <clear /> (( MSDN ライブラリ「compilation の assemblies の clear 要素 (ASP.NET 設定スキーマ)」&br;   https://msdn.microsoft.com/ja-jp/library/ms164616.aspx )) を記述する。
- [[5.2>#P520]] の設定既定値を全部削除するには、個別の [[Web.config>#nf687ad7]] にて [[5.1>#P510]] で指定する子要素の冒頭に <clear /> (( MSDN ライブラリ「compilation の assemblies の clear 要素 (ASP.NET 設定スキーマ)」&br;   https://msdn.microsoft.com/ja-jp/library/ms164616.aspx )) を記述する。

*** 5.5 読み込み設定の既定値を個別に削除する方法&aname(P550); [#kb25c50b]
- [[5.2>#P520]] の設定既定値を一つ一つ削除するには、個別の web.config にて [[5.1>#P510]] で指定する子要素に <remove assembly="アセンブリ名" /> ((MSDN ライブラリ「compilation の assemblies の remove 要素 (ASP.NET 設定スキーマ)」&br;   https://msdn.microsoft.com/ja-jp/library/6st6fhzz.aspx)) を記述する。
- [[5.2>#P520]] の設定既定値を一つ一つ削除するには、個別の [[Web.config>#nf687ad7]] にて [[5.1>#P510]] で指定する子要素に <remove assembly="アセンブリ名" /> ((MSDN ライブラリ「compilation の assemblies の remove 要素 (ASP.NET 設定スキーマ)」&br;   https://msdn.microsoft.com/ja-jp/library/6st6fhzz.aspx)) を記述する。
- 既定のまま[[後述 5.6>#P560]] の全読込設定となっている場合に、特定の (ASP.NET のローカル bin フォルダに配置する) アセンブリ DLL を個別に読み込み対象から削除した場合は、当該アセンブリ DLL に限り全読み込みの対象から外れる。~
(この場合も、当該アセンブリ DLL を必要とした時点で逐次読み込むのは、[[4.>#P400]] の通りである。)

*** 5.6 ASP.NET のローカル bin フォルダにあるアセンブリ DLL の全読込設定&aname(P560); [#c62f8d73]
- 全読込設定は既定値としてあらかじめ指定されているため、原則として指定不要である。
- [[5.3>#P530]] の、アセンブリ名部分にワイルドカード~
 <add assembly="*" />
を指定 ((MSDN ライブラリ「compilation の assemblies の add 要素 (ASP.NET 設定スキーマ)」&br;   https://msdn.microsoft.com/ja-jp/library/37e2zyhb.aspx &br;   の「解説」)) すると、ASP.NET のローカル bin フォルダにあるアセンブリ DLL をすべて読み込む。

** 6. ASP.NET で読み込むアセンブリ DLL の定義と、ビルドの関係&aname(P600); [#q6e8a1a6]
- ここでは Visual Studio 上の「ビルド」操作をしたときのビルド、および IIS 上の動的コンパイルについて記す。~
(ASP.NET の事前コンパイルは、ここでは説明の範囲外とする。)

*** 6.1 ASP.NET Web アプリケーションの場合&aname(P610); [#pcffc94e]
- ソリューション (*.sln) 上でビルドする時点では、コンパイルに必要なアセンブリ DLL が [[5.1>#P510]] での設定から漏れていた場合であってもコンパイル エラーとされない。~
(コンパイルそのものは、ASP.NET Web アプリケーションではコード部分のみ実施する。)
- IIS に配置し、それを初めて (またはコンパイル エラーが修正されないまま) ブラウザ等から参照した時点で、コンテンツ ファイル (*.aspx 等) の動的コンパイルが走る。~
(コンパイルに必要なアセンブリ DLL が [[5.1>#P510]] での設定から漏れていた場合は、ここでコンパイル エラーになる。)

*** 6.2 ASP.NET Web サイトの場合&aname(P620); [#eb7b7b44]
- ソリューション (*.sln) 上でビルドする時点で、コンパイル エラーに関するチェックがなされる。~
(コンパイルそのものは、ASP.NET Web サイトではビルド時に実施しない。)
- コンパイルに必要なアセンブリ DLL が [[5.1>#P510]] での設定から漏れていた場合に、コンパイル エラーとされる。
- IIS に配置し、それを初めて (またはコンパイル エラーが修正されないまま) ブラウザ等から参照した時点で、コンテンツ ファイル (*.aspx 等) の動的コンパイルが走る。~
(コンパイルに必要なアセンブリ DLL が [[5.1>#P510]] での設定から漏れていた場合は、ここでもコンパイル エラーになる。)

* 参考資料 [#y66eafe2]

** web.config [#nf687ad7]
** [[Web.config>.NET config#u3d1af27]] [#nf687ad7]


** ASP.NET のローカル bin フォルダ [#y3fd552b]
- MSDN ライブラリ「ASP.NET Web サイト内の共有コード フォルダ」~
[[https://msdn.microsoft.com/ja-jp/library/t990ks23(v=vs.100).aspx>https://msdn.microsoft.com/ja-jp/library/t990ks23(v=vs.100).aspx]]

** ASP.NET のコンパイルのタイミング [#r193efa5]
- @IT「ASP.NETアプリケーションの構造 ― 第2章 ASP.NET の基礎 2.2 ―」~
http://www.atmarkit.co.jp/fdotnet/bookpreview/learnaspnet_0201/learnaspnet_0201_01.html
-- 同・図2.16~
&ref(http://www.atmarkit.co.jp/fdotnet/bookpreview/learnaspnet_0201/2-16.gif,noimg,http://www.atmarkit.co.jp/fdotnet/bookpreview/learnaspnet_0201/2-16.gif);

- ASP.NET の動的コンパイルの概要~
[[https://msdn.microsoft.com/ja-jp/library/ms366723(v=vs.100).aspx>https://msdn.microsoft.com/ja-jp/library/ms366723(v=vs.100).aspx]]

- ASP.NET コンパイルの概要~
[[https://msdn.microsoft.com/ja-jp/library/ms178466(v=vs.100).aspx>https://msdn.microsoft.com/ja-jp/library/ms178466(v=vs.100).aspx]]~
※: ただし、ASP.NET Web サイトに特化した説明である。

----
Tags: [[:.NET開発]], [[:ASP.NET]], [[:障害対応]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS