反映發出應用程式案例

更新:2007 年 11 月

本節將進一步說明某些應用程式使用反映發出和動態方法的案例。

在 Web 瀏覽器中執行指令碼

在這個案例中,Web 瀏覽器載入含有指令碼程式的 HTML 網頁,並執行程式。步驟如下:

  1. Web 瀏覽器在 Web 瀏覽器的應用程式定義域中啟動指令碼引擎。

  2. Web 瀏覽器從 HTML 網頁擷取指令碼,並將它傳遞至指令碼引擎。

  3. 指令碼引擎建立暫時性動態組件。

  4. 指令碼引擎使用反映發出 API,發出程式碼到動態組件中。

在 ASP.NET 網頁中執行指令碼

在這個案例中,瀏覽器開啟含有指令碼程式的 ASP.NET 網頁。程式在伺服器上編譯並執行。步驟如下:

  1. ASP.NET 啟動它的應用程式定義域,並啟動指令碼引擎來編譯和執行程式。

  2. 指令碼引擎建立永久性動態組件和動態組件中的永久性動態模組。

  3. 指令碼引擎使用反映發出 API 來編譯程式,並發出程式碼到永久性動態模組中。

  4. 執行編譯的程式碼,接著遇到 eval 運算式。

  5. 指令碼引擎在動態組件中建立暫時性 (Transient) 動態模組來包含 eval 運算式的程式碼。

  6. 指令碼引擎會執行暫時性動態模組來評估 eval 運算式。

  7. ASP.NET 要求指令碼引擎,將動態組件和永久性動態模組儲存在快取中,好讓再次造訪網頁時,不需重新編譯指令碼。

使用反映發出編譯規則運算式

在這個案例中,編譯器使用反映發出來編譯原始程式碼中的規則運算式。使用者可以宣告哪些規則運算式應該被編譯。步驟如下:

  1. 編譯器處理使用者原始程式碼中首次的規則運算式使用。

  2. 編譯器使用反映發出將規則運算式編譯成自訂掃描器類別,因為使用者已經要求運算式要被編譯。規則運算式首先會轉譯為編譯器的規則運算式 opcode。例如,一個指令可能會說,"try to match zero or more a's" (試著比對零或更多的 a)。規則運算式 opcodes 即接著轉譯為 Microsoft Intermediate Language (MSIL)。例如,編譯器可能產生迴圈 (Loop),重複它所找到的所有字母項目。

  3. 編譯器儲存編譯的掃描器類別以備以後之用。

  4. 編譯器執行個體化編譯的掃描器類別,並執行目前應用程式定義域中的程式碼。

  5. 編譯器處理使用者原始程式碼中相同規則運算式的後續使用。

  6. 編譯器擷取為規則運算式的編譯的掃描器類別、將它執行個體化,並在目前應用程式定義域中執行程式碼。

當使用規則運算式的第一個執行個體時,使用者會遭受效能損失,因為編譯器必須將運算式編譯成掃描器類別。然而,相同規則運算式的後續使用將會有效率地執行。對於經常使用的規則運算式,一時的編譯 (Compilation) 損失並不大,因為執行時間可以的大幅改善。

請參閱

其他資源

發出動態方法和組件

.NET Framework 規則運算式

使用反映發出