ControlFlowBuilder Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Genererar grenar och undantagsblock i en metodtext.
public ref class ControlFlowBuilder sealed
public sealed class ControlFlowBuilder
type ControlFlowBuilder = class
Public NotInheritable Class ControlFlowBuilder
- Arv
-
ControlFlowBuilder
Exempel
Det här exemplet visar hur du genererar en metodtext med undantagshanteraren med hjälp av 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;
}
Kommentarer
Klassen ControlFlowBuilder används för att skapa grenar och undantagsblock i en metodtext som kodas av InstructionEncoder. Mer information om hur du genererar .NET sammansättningar finns i MetadataBuilder-klassdokumentationen.
Konstruktorer
| Name | Description |
|---|---|
| ControlFlowBuilder() |
Genererar grenar och undantagsblock i en metodtext. |
Metoder
| Name | Description |
|---|---|
| AddCatchRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, EntityHandle) |
Lägger till fångstregion. |
| AddFaultRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Lägger till felregion. |
| AddFilterRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Lägger till fångstregion. |
| AddFinallyRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Lägger till äntligen region. |
| Clear() |
Rensar objektets interna tillstånd så att samma instans kan återanvändas. |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |