共用方式為


反映發出技術範例

更新:2007 年 11 月

這個範例將說明如何使用反映發出。反映發出是屬於執行階段的功能,這個功能能讓程式碼建立動態組件、模組和型別。您可以用動態方式建立這些型別的執行個體來使用,也可以用反映發出產生組件,並將其保存 (Persist) 於磁碟中做為可執行檔或 DLL。這個範例是由兩個可執行檔所構成:第一個可執行檔為 EmitAssembly.exe,它會產生動態型別並進行測試,或者產生動態型別後將其保持至磁碟中做為 DLL。第二個可執行檔為 TestEmittedAssembly.exe,它只會測試由 EmitAssembly.exe 以動態方式發出的組件。EmitAssembly.exe 所發出的型別是名為 "HelloWorld" 的簡單類別,其建構函式只使用了單一字串參數。這個型別也會實作 GetGreeting() 方法,該方法會傳回傳遞至執行個體建構函式的字串。

如需使用這些範例的詳細資訊,請參閱下列主題:

Download sample

若要使用命令提示字元建置範例

  1. 開啟 [命令提示字元] 視窗,並巡覽至此範例的任一程式設計語言的子目錄。

  2. 根據您選擇的程式設計語言,在命令列輸入 msbuild ReflectionEmitCS.sln 或 msbuild ReflectionEmitVB.sln。

  3. 編譯 EmitAssembly 類別,藉以建置測試組件。根據您選擇的程式設計語言,在命令列輸入 csc /target:library EmitAssembly.cs 或 vbc /target:library TestEmittedAssembly.vb。產生的輸出檔就是 EmitAssembly.dll。

若要使用 Visual Studio 建置範例

  1. 開啟 [Windows 檔案總管],並巡覽至此範例的任一程式設計語言的子目錄。

  2. 根據您選擇的程式設計語言,按兩下 ReflectionEmitCS.sln 或 ReflectionEmitVB.sln 檔案的圖示,在 Visual Studio 中開啟該檔案。

  3. 在 [建置] 功能表中,選取 [建置方案]。

  4. 建置 EmitAssembly 類別,藉以建置測試組件。使用 EmitAssembly.cs 或 EmitAssembly.vb 檔,建立並建置 [類別庫] 專案。產生的輸出檔就是 EmitAssembly.dll。

若要執行範例

  1. 開啟 [命令提示字元] 視窗,巡覽至新的可執行檔所在的目錄。

  2. 依序在命令列中輸入 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

AssemblyBuilder

AssemblyBuilderAccess

AssemblyName

ConstructorBuilder

FieldBuilder

ILGenerator

MethodAttributes

MethodBuilder

MethodInfo

ModuleBuilder

ResolveEventHandler

System.IO

System.Reflection

System.Reflection.Emit

System.Threading

TypeBuilder

其他資源

反映

發出動態方法和組件

動態原始程式碼的產生和編譯

處理和引發事件

Managed 和 Unmanaged 事件