static void Main(string[] args)
        {
            var result = SomeClass.Calculate(1000);

            Console.WriteLine(result);

            var calc = new DynamicMethod("CalcMethod",
                                         typeof(int),
                                         new[] { typeof(int) },
                                         typeof(Program).Module);

            var il = calc.GetILGenerator();
            // Define labels for loop and return from method
            var loopStart = il.DefineLabel();
            var methodEnd = il.DefineLabel();

            // variable 0 : result = 0
            il.DeclareLocal(typeof(int));              // declare local variable result
            il.Emit(OpCodes.Ldc_I4_0);                 // Create  local variable of Integer (4 bytes) with 0
            il.Emit(OpCodes.Stloc_0);                  // Store the local variable

            // variable 1 : i = 0
            il.DeclareLocal(typeof(int));              // declare local variable result
            il.Emit(OpCodes.Ldc_I4_0);                 // Create  local variable of Integer (4 bytes) with 0
            il.Emit(OpCodes.Stloc_1);                  // Store the local variable

            // Mark beginning of loop
            il.MarkLabel(loopStart);
            il.Emit(OpCodes.Ldloc_1);         // value of i now on evaluation stack
            il.Emit(OpCodes.Ldc_I4, 10);      // Create local variable of Integer (4 bytes) with value of 10
            il.Emit(OpCodes.Bge, methodEnd);  // If i >= 10, jump to method end
            // i * x
            il.Emit(OpCodes.Ldloc_1);         // Load value of i to evaluation stack
            il.Emit(OpCodes.Ldarg_0);         // Load argument to evaluation stack
            il.Emit(OpCodes.Mul);             // multiply i * x

            // result +=
            il.Emit(OpCodes.Ldloc_0);                   // Load result onto evailation stack
            il.Emit(OpCodes.Add);                       // Add result of multiplication (i) to local variable (result)
            il.Emit(OpCodes.Stloc_0);                   // Store result in local variable

            // increment i
            il.Emit(OpCodes.Ldloc_1);                       //Load value of i to evaluation stack
            il.Emit(OpCodes.Ldc_I4_1);                      // Load value of 1 to evaluation stack
            il.Emit(OpCodes.Add);                           // Increment
            il.Emit(OpCodes.Stloc_1);                       // ** Store the value i!!

            // Return to loop start
            il.Emit(OpCodes.Br, loopStart);

            // When i > 10
            il.MarkLabel(methodEnd);
            il.Emit(OpCodes.Ldloc_0);                       // Load result to evaluation stack
            il.Emit(OpCodes.Ret);                           // Return from method

            // Create the delegate
            var method = (Func <int, int>)calc.CreateDelegate(typeof(Func <int,   // Parameter 1
                                                                           int    // Return type
                                                                           >));

            var result2 = method(1000);

            Console.WriteLine(result);
        }