ControlFlowBuilder Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Émet des branches et des blocs d’exception dans un corps de méthode.
public ref class ControlFlowBuilder sealed
public sealed class ControlFlowBuilder
type ControlFlowBuilder = class
Public NotInheritable Class ControlFlowBuilder
- Héritage
-
ControlFlowBuilder
Exemples
Cet exemple montre comment émettre un corps de méthode avec le gestionnaire d’exceptions à l’aide de 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;
}
Remarques
La ControlFlowBuilder classe est utilisée pour créer des branches et des blocs d’exception dans un corps de méthode encodé par InstructionEncoder. Pour plus d’informations sur l’émission d’assemblys .NET, consultez la documentation de la MetadataBuilder classe.
Constructeurs
ControlFlowBuilder() |
Émet des branches et des blocs d’exception dans un corps de méthode. |
Méthodes
AddCatchRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, EntityHandle) |
Ajoute la région catch. |
AddFaultRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Ajoute une région fault. |
AddFilterRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Ajoute la région catch. |
AddFinallyRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Ajoute une région finally. |
Clear() |
Efface l’état interne de l’objet, ce qui permet de réutiliser les mêmes instance. |
Equals(Object) |
Détermine si l'objet spécifié est égal à l'objet actuel. (Hérité de Object) |
GetHashCode() |
Fait office de fonction de hachage par défaut. (Hérité de Object) |
GetType() |
Obtient le Type de l'instance actuelle. (Hérité de Object) |
MemberwiseClone() |
Crée une copie superficielle du Object actuel. (Hérité de Object) |
ToString() |
Retourne une chaîne qui représente l'objet actuel. (Hérité de Object) |