Export (0) Print
Expand All

ILGenerator.BeginScope Method

Begins a lexical scope.

Namespace: System.Reflection.Emit
Assembly: mscorlib (in mscorlib.dll)

public virtual void BeginScope ()
public void BeginScope ()
public function BeginScope ()
Not applicable.

Exception typeCondition

NotSupportedException

This ILGenerator belongs to a DynamicMethod.

This method is used to emit symbolic information. Local variables declared after BeginScope are scoped until the corresponding EndScope is called.

If the current ILGenerator is associated with a DynamicMethod object, it does not support symbolic information.

The following code sample illustrates the use of BeginScope and EndScope.

// Get the current AppDomain.
AppDomain myAppDomain = AppDomain.CurrentDomain;
AssemblyName myAssemblyName = new AssemblyName();
myAssemblyName.Name = "SampleAssembly";

// Create a dynamic assembly 'myAssembly' with access mode 'Run'.
AssemblyBuilder myAssembly = myAppDomain.DefineDynamicAssembly(
                        myAssemblyName, AssemblyBuilderAccess.Run);
// Create a dynamic module 'myModule' in 'myAssembly'.
ModuleBuilder myModule=myAssembly.DefineDynamicModule("MyDynamicModule",true);
// Define a public class 'MyDynamicClass'.
TypeBuilder myTypeBuilder = myModule.DefineType("MyDynamicClass",
                                 TypeAttributes.Public);
// Define a public string field.
FieldBuilder myField = myTypeBuilder.DefineField("MyDynamicField", 
                         typeof(String), FieldAttributes.Public);
// Create the constructor.
Type[] myConstructorArgs = {typeof(String)};
ConstructorBuilder myConstructor = myTypeBuilder.DefineConstructor(
   MethodAttributes.Public, CallingConventions.Standard, myConstructorArgs);

// Generate IL for 'myConstructor'.
ILGenerator myConstructorIL = myConstructor.GetILGenerator();
// Emit the necessary opcodes.
myConstructorIL.Emit(OpCodes.Ldarg_0);
ConstructorInfo mySuperConstructor = typeof(Object).GetConstructor(new Type[0]);
myConstructorIL.Emit(OpCodes.Call, mySuperConstructor);
myConstructorIL.Emit(OpCodes.Ldarg_0);
myConstructorIL.Emit(OpCodes.Ldarg_1);
myConstructorIL.Emit(OpCodes.Stfld, myField);
myConstructorIL.Emit(OpCodes.Ret);

// Define a dynamic method named 'MyDynamicMethod'.
MethodBuilder myMethod = myTypeBuilder.DefineMethod("MyDynamicMethod",
   MethodAttributes.Public, typeof(String), null);
// Generate IL for 'myMethod'.
ILGenerator myMethodIL = myMethod.GetILGenerator();

// Begin the scope for a local variable.
myMethodIL.BeginScope();

LocalBuilder myLocalBuilder = myMethodIL.DeclareLocal(typeof(int));
Console.WriteLine("\nTrying to access the local variable within the scope.");
Console.WriteLine("'myLocalBuilder' type is: {0}", myLocalBuilder.LocalType);
myMethodIL.Emit(OpCodes.Ldstr, "Local value");
myMethodIL.Emit(OpCodes.Stloc_0, myLocalBuilder);

// End the scope of 'myLocalBuilder'.
myMethodIL.EndScope();

// Access the local variable outside the scope.
Console.WriteLine("\nTrying to access the local variable outside the scope:");
myMethodIL.Emit(OpCodes.Stloc_0, myLocalBuilder);
myMethodIL.Emit(OpCodes.Ldloc_0 );
myMethodIL.Emit(OpCodes.Ret );

// Create 'MyDynamicClass' class.
Type myType1 = myTypeBuilder.CreateType();

Windows 98, Windows Server 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The Microsoft .NET Framework 3.0 is supported on Windows Vista, Microsoft Windows XP SP2, and Windows Server 2003 SP1.

.NET Framework

Supported in: 3.0, 2.0, 1.1, 1.0

Community Additions

ADD
Show:
© 2014 Microsoft