DekGenius.com
[ Team LiB ] Previous Section Next Section

ILGenerator

System.Reflection.Emit (mscorlib.dll)class

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);
}

Returned By

ConstructorBuilder.GetILGenerator( ), MethodBuilder.GetILGenerator( )

    [ Team LiB ] Previous Section Next Section