Share via


反映發出應用程式案例

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

在 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 規則運算式

使用反映發出