ControlFlowBuilder Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Verzendt vertakkingen en uitzonderingsblokken in een hoofdtekst van een methode.
public ref class ControlFlowBuilder sealed
public sealed class ControlFlowBuilder
type ControlFlowBuilder = class
Public NotInheritable Class ControlFlowBuilder
- Overname
-
ControlFlowBuilder
Voorbeelden
In dit voorbeeld ziet u hoe u een methodetekst verzendt met de uitzonderingshandler met behulp van 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;
}
Opmerkingen
De ControlFlowBuilder klasse wordt gebruikt voor het maken van vertakkingen en uitzonderingsblokken in een methodebody die is gecodeerd door InstructionEncoder. Zie de MetadataBuilder klassedocumentatie voor meer informatie over het verzenden van .NET assembly's.
Constructors
| Name | Description |
|---|---|
| ControlFlowBuilder() |
Verzendt vertakkingen en uitzonderingsblokken in een hoofdtekst van een methode. |
Methoden
| Name | Description |
|---|---|
| AddCatchRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, EntityHandle) |
Voegt catch-regio toe. |
| AddFaultRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Voegt foutregio toe. |
| AddFilterRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Voegt catch-regio toe. |
| AddFinallyRegion(LabelHandle, LabelHandle, LabelHandle, LabelHandle) |
Voegt eindelijk regio toe. |
| Clear() |
Hiermee wist u de interne status van het object, zodat hetzelfde exemplaar opnieuw kan worden gebruikt. |
| Equals(Object) |
Bepaalt of het opgegeven object gelijk is aan het huidige object. (Overgenomen van Object) |
| GetHashCode() |
Fungeert als de standaardhashfunctie. (Overgenomen van Object) |
| GetType() |
Hiermee haalt u de Type huidige instantie op. (Overgenomen van Object) |
| MemberwiseClone() |
Hiermee maakt u een ondiepe kopie van de huidige Object. (Overgenomen van Object) |
| ToString() |
Retourneert een tekenreeks die het huidige object vertegenwoordigt. (Overgenomen van Object) |