リフレクション出力のアプリケーション シナリオ

ここでは、アプリケーションでリフレクション出力と動的メソッドが使用されるシナリオについて詳細に説明します。

Web ブラウザーでのスクリプトの実行

このシナリオでは、スクリプト プログラムが組み込まれている HTML ページを Web ブラウザーが読み込み、このプログラムを実行します。 各ステップは次のとおりです。

  1. Web ブラウザーにより、Web ブラウザーのアプリケーション ドメインでスクリプト エンジンが起動されます。

  2. Web ブラウザーにより、HTML ページからスクリプトが抽出され、スクリプト エンジンに渡されます。

  3. スクリプト エンジンにより、一時動的アセンブリが作成されます。

  4. スクリプト エンジンは、リフレクション出力 API を使用して動的アセンブリにコードを出力します。

ASP.NET ページのスクリプトの実行

このシナリオでは、スクリプト プログラムが組み込まれている ASP.NET ページがブラウザーに表示されます。 このスクリプト プログラムはサーバーでコンパイルされてから実行されます。 各ステップは次のとおりです。

  1. ASP.NET はアプリケーション ドメインを開始し、スクリプト プログラムをコンパイルして実行するためのスクリプト エンジンを起動します。

  2. スクリプト エンジンにより永続動的アセンブリが作成され、この動的アセンブリに永続動的モジュールが作成されます。

  3. スクリプト エンジンは、リフレクション出力 API を使用してプログラムをコンパイルし、永続可能な動的モジュールにコードを出力します。

  4. コンパイルされたコードが実行され、eval 式が検出されます。

  5. スクリプト エンジンにより、一時動的モジュールが動的アセンブリの中に作成され、eval 式のコードが格納されます。

  6. スクリプト エンジンにより一時動的モジュールが実行され、eval 式が評価されます。

  7. ASP.NET は、スクリプト エンジンに対して動的アセンブリと永続動的モジュールをキャッシュ内に保存するように要求します。これにより、ASP.NET ページへ再度アクセスした場合に、スクリプトを再度コンパイルする必要がなくなります。

リフレクション出力を使用した正規表現のコンパイル

このシナリオでは、コンパイラがリフレクション出力を使用してソース コードの正規表現をコンパイルします。 コンパイルする正規表現をユーザーが宣言できます。 各ステップは次のとおりです。

  1. コンパイラにより、ユーザーのソース コードの正規表現の最初のインスタンスが処理されます。

  2. 正規表現をコンパイルするようにユーザーが要求しているため、コンパイラにより、リフレクション出力を使用してこの正規表現がコンパイルされ、カスタム スキャナー クラスに変換されます。 最初に、正規表現はコンパイラの正規表現オペコードに変換されます。 たとえば、"0 個以上の a に一致する文字を検索する" という命令がある場合には、 正規表現オペコードは Microsoft Intermediate Language (MSIL) に変換されます。 また、コンパイラが検出した文字 a のすべてのオカレンスで繰り返すループが生成されることもあります。

  3. コンパイル後のスキャナー クラスを今後使用できるように、コンパイラによりこのクラスが保存されます。

  4. コンパイラにより、コンパイル後のスキャナー クラスのインスタンスが作成され、現在のアプリケーション ドメインでコードが実行されます。

  5. コンパイラにより、ユーザーのソース コード上の同じ正規表現の他のインスタンスが処理されます。

  6. コンパイラにより、正規表現に対応するコンパイル後のスキャナー クラスが取得され、このクラスのインスタンスが作成され、現在のアプリケーション ドメインでコードが実行されます。

正規表現の最初のインスタンスが使用されるときに、パフォーマンスが低下します。これは、正規表現をコンパイルしてスキャナー クラスへ変換する処理が実行されるためです。 ただし、同じ正規表現の後続のインスタンスは効率的に実行されます。 頻繁に使用される正規表現の場合、最初のコンパイルでのパフォーマンスの低下は重大ではありません。これは、この処理によってその後の実行時間が大幅に短縮される可能性があるためです。

参照

その他の技術情報

動的メソッドおよびアセンブリの出力

.NET Framework の正規表現

リフレクション出力の使用