ControlFlowBuilder Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Gibt Verzweigungen und Ausnahmeblöcke in einem Methodentext aus.
public ref class ControlFlowBuilder sealed
public sealed class ControlFlowBuilder
type ControlFlowBuilder = class
Public NotInheritable Class ControlFlowBuilder
- Vererbung
-
ControlFlowBuilder
Beispiele
In diesem Beispiel wird gezeigt, wie ein Methodentext mit dem Ausnahmehandler mithilfe von ausgegeben wird 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;
}
Hinweise
Die ControlFlowBuilder -Klasse wird verwendet, um Verzweigungen und Ausnahmeblöcke in einem von InstructionEncodercodierten Methodentext zu erstellen. Weitere Informationen zum Ausgeben von .NET-Assemblys finden Sie in der MetadataBuilder Klassendokumentation.
Konstruktoren
ControlFlowBuilder() |
Gibt Verzweigungen und Ausnahmeblöcke in einem Methodentext aus. |
Methoden
AddCatchRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, EntityHandle) |
Fügt den Catch-Bereich hinzu. |
AddFaultRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Fügt einen Fault-Bereich hinzu. |
AddFilterRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Fügt den Catch-Bereich hinzu. |
AddFinallyRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Fügt den Finally-Bereich hinzu. |
Clear() |
Löscht den internen Zustand des Objekts, sodass die gleichen instance wiederverwendet werden können. |
Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (Geerbt von Object) |
GetHashCode() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |