This class generates MSIL (Microsoft Intermediate Language)
instructions. You receive an ILGenerator object
from a
GetILGenerator method in a builder class. For
example, you can use the ConstructorBuilder.GetILGenerator(
) to create MSIL instructions for a constructor, or
MethodBuilder.GetILGenerator( ) to create MSIL
instructions for a method. Use BeginScope( ) and
EndScope( ) to start and stop a lexical scope.
To emit instructions, use the Emit( ) method. The
Emit( ) method requires an
OpCode object. The easiest way to supply this is
by using one of the constant fields from OpCodes,
as in myGenerator.Emit(OpCodes.Ret);.
EmitWriteLine( ) creates the MSIL code required to
call System.Console.WriteLine( ) with the supplied
variable. You can also define and mark labels in the instruction
stream (DefineLabel( ) and MarkLabel(
)), emit an instruction for throwing an exception
(ThrowException( )), and define local variables
(DeclareLocal( )).
Emit error handling blocks with BeginExceptionBlock(
) and EndExceptionBlock( ) (which emits
the equivalent of a C# try statement),
BeginCatchBlock( ) (which emits the equivalent of
the catch statement), and
BeginFinallyBlock( ) (which emits the equivalent
of the finally statement). You must end the
exception block using EndExceptionBlock( ).
public class ILGenerator {
// Public Instance Methods
public virtual void BeginCatchBlock(Type exceptionType);
public virtual void BeginExceptFilterBlock( );
public virtual Label BeginExceptionBlock( );
public virtual void BeginFaultBlock( );
public virtual void BeginFinallyBlock( );
public virtual void BeginScope( );
public LocalBuilder DeclareLocal(Type localType);
public virtual Label DefineLabel( );
public virtual void Emit(OpCode opcode);
public virtual void Emit(OpCode opcode, byte arg);
public virtual void Emit(OpCode opcode, System.Reflection.ConstructorInfo con);
public virtual void Emit(OpCode opcode, double arg);
public virtual void Emit(OpCode opcode, System.Reflection.FieldInfo field);
public virtual void Emit(OpCode opcode, short arg);
public virtual void Emit(OpCode opcode, int arg);
public virtual void Emit(OpCode opcode, long arg);
public virtual void Emit(OpCode opcode, Label label);
public virtual void Emit(OpCode opcode, Label[ ] labels);
public virtual void Emit(OpCode opcode, LocalBuilder local);
public virtual void Emit(OpCode opcode, System.Reflection.MethodInfo meth);
public void Emit(OpCode opcode, sbyte arg);
public virtual void Emit(OpCode opcode, SignatureHelper signature);
public virtual void Emit(OpCode opcode, float arg);
public virtual void Emit(OpCode opcode, string str);
public virtual void Emit(OpCode opcode, Type cls);
public void EmitCall(OpCode opcode, System.Reflection.MethodInfo methodInfo,
Type[ ] optionalParameterTypes);
public void EmitCalli(OpCode opcode, System.Reflection.CallingConventions callingConvention,
Type returnType, Type[ ] parameterTypes, Type[ ] optionalParameterTypes);
public void EmitCalli(OpCode opcode, System.Runtime.InteropServices.CallingConvention unmanagedCallConv,
Type returnType, Type[ ] parameterTypes);
public virtual void EmitWriteLine(System.Reflection.FieldInfo fld);
public virtual void EmitWriteLine(LocalBuilder localBuilder);
public virtual void EmitWriteLine(string value);
public virtual void EndExceptionBlock( );
public virtual void EndScope( );
public virtual void MarkLabel(Label loc);
public virtual void MarkSequencePoint(System.Diagnostics.SymbolStore.ISymbolDocumentWriter document,
int startLine, int startColumn, int endLine, int endColumn);
public virtual void ThrowException(Type excType);
public void UsingNamespace(string usingNamespace);
}