ControlFlowBuilder Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Memancarkan cabang dan blok pengecualian dalam isi metode.
public ref class ControlFlowBuilder sealed
public sealed class ControlFlowBuilder
type ControlFlowBuilder = class
Public NotInheritable Class ControlFlowBuilder
- Warisan
-
ControlFlowBuilder
Contoh
Contoh ini menunjukkan cara memancarkan isi metode dengan handler pengecualian menggunakan ControlFlowBuilder:
// The following code emits method body similar to this C# code:
/* public static void ExceptionBlockTest(int x, int y)
{
try
{
Console.WriteLine(x / y);
}
catch (DivideByZeroException)
{
Console.WriteLine("Error: division by zero");
}
}
*/
public static InstructionEncoder ControlFlowBuilderDemo(MetadataBuilder metadata,
AssemblyReferenceHandle corlibAssemblyRef)
{
var codeBuilder = new BlobBuilder();
var flowBuilder = new ControlFlowBuilder();
var encoder = new InstructionEncoder(codeBuilder, flowBuilder);
// Get reference to System.Console
AssemblyReferenceHandle systemConsoleAssemblyRef = metadata.AddAssemblyReference(
name: metadata.GetOrAddString("System.Console"),
version: new Version(4, 0, 0, 0),
culture: default(StringHandle),
publicKeyOrToken: default(BlobHandle),
flags: default(AssemblyFlags),
hashValue: default(BlobHandle));
TypeReferenceHandle consoleTypeRefHandle = metadata.AddTypeReference(
systemConsoleAssemblyRef,
metadata.GetOrAddString("System"),
metadata.GetOrAddString("Console"));
// Get reference to void System.Console::WriteLine(int32)
var methodSignature = new BlobBuilder();
new BlobEncoder(methodSignature).
MethodSignature(isInstanceMethod: false).
Parameters(1, returnType => returnType.Void(), parameters => parameters.AddParameter().Type().Int32());
BlobHandle sigBlobIndex1 = metadata.GetOrAddBlob(methodSignature);
MemberReferenceHandle refWriteLineInt32 = metadata.AddMemberReference(
consoleTypeRefHandle,
metadata.GetOrAddString("WriteLine"),
sigBlobIndex1);
// Get reference to void System.Console::WriteLine(string)
methodSignature = new BlobBuilder();
new BlobEncoder(methodSignature).
MethodSignature(isInstanceMethod: false).
Parameters(1, returnType => returnType.Void(), parameters => parameters.AddParameter().Type().String());
BlobHandle sigBlobIndex2 = metadata.GetOrAddBlob(methodSignature);
MemberReferenceHandle refWriteLineString = metadata.AddMemberReference(
consoleTypeRefHandle,
metadata.GetOrAddString("WriteLine"),
sigBlobIndex2);
// Get reference to System.DivideByZeroException
TypeReferenceHandle exceptionTypeRefHandle = metadata.AddTypeReference(
corlibAssemblyRef,
metadata.GetOrAddString("System"),
metadata.GetOrAddString("DivideByZeroException"));
LabelHandle labelTryStart = encoder.DefineLabel();
LabelHandle labelTryEnd = encoder.DefineLabel();
LabelHandle labelCatchStart = encoder.DefineLabel();
LabelHandle labelCatchEnd = encoder.DefineLabel();
LabelHandle labelExit = encoder.DefineLabel();
flowBuilder.AddCatchRegion(labelTryStart, labelTryEnd, labelCatchStart, labelCatchEnd,
exceptionTypeRefHandle);
// .try {
encoder.MarkLabel(labelTryStart);
// ldarg.0
encoder.OpCode(ILOpCode.Ldarg_0);
// ldarg.1
encoder.OpCode(ILOpCode.Ldarg_1);
// div
encoder.OpCode(ILOpCode.Div);
// call void [System.Console]System.Console::WriteLine(int32)
encoder.Call(refWriteLineInt32);
// leave.s EXIT
encoder.Branch(ILOpCode.Leave_s, labelExit);
encoder.MarkLabel(labelTryEnd);
// }
// catch [System.Runtime]System.DivideByZeroException {
encoder.MarkLabel(labelCatchStart);
// pop
encoder.OpCode(ILOpCode.Pop);
// ldstr "Error: division by zero"
encoder.LoadString(metadata.GetOrAddUserString("Error: division by zero"));
// call void [System.Console]System.Console::WriteLine(string)
encoder.Call(refWriteLineString);
// leave.s EXIT
encoder.Branch(ILOpCode.Leave_s, labelExit);
encoder.MarkLabel(labelCatchEnd);
// } EXIT: ret
encoder.MarkLabel(labelExit);
encoder.OpCode(ILOpCode.Ret);
return encoder;
}
Keterangan
Kelas ControlFlowBuilder ini digunakan untuk membuat cabang dan blok pengecualian dalam isi metode yang dikodekan oleh InstructionEncoder. Untuk informasi selengkapnya tentang memancarkan rakitan .NET, lihat MetadataBuilder dokumentasi kelas.
Konstruktor
ControlFlowBuilder() |
Memancarkan cabang dan blok pengecualian dalam isi metode. |
Metode
AddCatchRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, EntityHandle) |
Menambahkan wilayah tangkapan. |
AddFaultRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Menambahkan wilayah kesalahan. |
AddFilterRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Menambahkan wilayah tangkapan. |
AddFinallyRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Menambahkan wilayah akhirnya. |
Clear() |
Menghapus status internal objek, memungkinkan instans yang sama digunakan kembali. |
Equals(Object) |
Menentukan apakah objek yang ditentukan sama dengan objek saat ini. (Diperoleh dari Object) |
GetHashCode() |
Berfungsi sebagai fungsi hash default. (Diperoleh dari Object) |
GetType() |
Mendapatkan instans Type saat ini. (Diperoleh dari Object) |
MemberwiseClone() |
Membuat salinan dangkal dari yang saat ini Object. (Diperoleh dari Object) |
ToString() |
Mengembalikan string yang mewakili objek saat ini. (Diperoleh dari Object) |