反映發出技術範例
更新:2007 年 11 月
這個範例將說明如何使用反映發出。反映發出是屬於執行階段的功能,這個功能能讓程式碼建立動態組件、模組和型別。您可以用動態方式建立這些型別的執行個體來使用,也可以用反映發出產生組件,並將其保存 (Persist) 於磁碟中做為可執行檔或 DLL。這個範例是由兩個可執行檔所構成:第一個可執行檔為 EmitAssembly.exe,它會產生動態型別並進行測試,或者產生動態型別後將其保持至磁碟中做為 DLL。第二個可執行檔為 TestEmittedAssembly.exe,它只會測試由 EmitAssembly.exe 以動態方式發出的組件。EmitAssembly.exe 所發出的型別是名為 "HelloWorld" 的簡單類別,其建構函式只使用了單一字串參數。這個型別也會實作 GetGreeting() 方法,該方法會傳回傳遞至執行個體建構函式的字串。
如需使用這些範例的詳細資訊,請參閱下列主題:
若要使用命令提示字元建置範例
開啟 [命令提示字元] 視窗,並巡覽至此範例的任一程式設計語言的子目錄。
根據您選擇的程式設計語言,在命令列輸入 msbuild ReflectionEmitCS.sln 或 msbuild ReflectionEmitVB.sln。
編譯 EmitAssembly 類別,藉以建置測試組件。根據您選擇的程式設計語言,在命令列輸入 csc /target:library EmitAssembly.cs 或 vbc /target:library TestEmittedAssembly.vb。產生的輸出檔就是 EmitAssembly.dll。
若要使用 Visual Studio 建置範例
開啟 [Windows 檔案總管],並巡覽至此範例的任一程式設計語言的子目錄。
根據您選擇的程式設計語言,按兩下 ReflectionEmitCS.sln 或 ReflectionEmitVB.sln 檔案的圖示,在 Visual Studio 中開啟該檔案。
在 [建置] 功能表中,選取 [建置方案]。
建置 EmitAssembly 類別,藉以建置測試組件。使用 EmitAssembly.cs 或 EmitAssembly.vb 檔,建立並建置 [類別庫] 專案。產生的輸出檔就是 EmitAssembly.dll。
若要執行範例
開啟 [命令提示字元] 視窗,巡覽至新的可執行檔所在的目錄。
依序在命令列中輸入 EmitAssembly.exe 以及要傳遞做為參數的值。
注意事項: |
---|
這個範例會建置一個主控台應用程式。您必須在命令提示字元視窗中啟動及執行,才能檢視它的輸出。 |
備註
如需反映發出的詳細資訊,請參閱原始程式碼檔案中的註解。
注意事項: |
---|
MsBuild 工具會建置兩個執行檔:EmitAssembly.exe 和 TestEmittedAssembly.exe。但是,如果要建置 TestEmittedAssembly.exe,編譯器必須能開啟參考的組件 "EmittedAssembly.dll"。EmitAssembly.exe 建置完成之後,MsBuild 工具會利用命令列參數 "2" 執行 EmitAssembly,表示此範例應發出動態組件。 |
EmitAssembly 可執行檔會接受能指出您想要執行之測試的命令列參數。1 這個值會讓範例發出動態型別至其 AppDomain,並測試範例中的靜態成員。2 這個值會讓範例發出動態型別至組件,並將此組件以 .DLL 及 .MOD 檔案的格式保存至磁碟中。完成這些工作之後,即可執行 TestEmittedAssembly.exe 或 ILDasm.exe 來測試發出的程式碼。
例如:
TestEmittedAssembly.exe
ILDasm EmittedModule.mod
3 這個值會讓範例發出動態型別至組件,並發出會測試第一個動態型別程式碼的第二個動態型別。
本範例使用下列技術和類別:
AppDomain 這個範例使用 AppDomain 型別,在範例的 AppDomain 中建立動態組件。它會以呼叫 DefineDynamicAssembly 的方式完成這項工作。
AssemblyBuilder 用來建置動態組件。它能用來建立立即使用的組件,或是以 DLL 或 EXE 檔案保存的動態組件。
AssemblyName 用來定義組件的唯一識別。此範例以最簡單的方式使用這個型別,即給予動態組件文字名稱 "EmittedAssembly"。
ModuleBuilder 用來在動態組件中建置動態模組。
TypeBuilder 用來以動態方式建置型別。這個型別衍生自 Type。從這個型別,您可以要求 FieldBuilder、ConstructorBuilder 和 MethodBuilder 等型別的執行個體。範例會使用這些型別,產生一個完整的型別。
FieldBuilder 用來在動態型別中建立欄位。
ConstructorBuilder 用來在動態型別中定義建構函式。
MethodBuilder 用來在動態型別中定義方法。
ILGeneratorMethodBuilder 和 ConstructorBuilder 都會實作 GetILGenerator 方法。這些方法會傳回 ILGenerator 型別的執行個體,用來以動態方式產生型別的 Microsoft Intermediate Language (MSIL) 程式碼。