private void ilList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (ilList.SelectedItem is ILInstruction)
            {
                var selectedInstruction = (ILInstruction)ilList.SelectedItem;

                this.descriptionLabel.Content = OpCodeDescriber.Describe(selectedInstruction.OpCode);
            }
        }
        /// <summary>
        /// Executes the IL instruction, returns an offset if branching was requested.
        /// </summary>
        /// <param name="instruction">The instruction to execute</param>
        /// <param name="vCLRExecContext">The context of the executed method</param>
        /// <param name="callerContext">A reference to caller's context</param>
        /// <returns>Returns an offset (if branching was requested)</returns>
        private object ExecuteInstruction(ILInstruction instruction, VCLRExecContext vCLRExecContext, VCLRExecContext callerContext = null)
        {
            switch (instruction.OpCode)
            {
            case EnumOpCode.Nop:
                break;           //do nothing

            case EnumOpCode.Ret: //Returns from the current method, pushing a return value (if present) from the callee's evaluation stack onto the caller's evaluation stack.
                Ret(instruction, vCLRExecContext, callerContext);
                break;

            case EnumOpCode.Blt:
                Blt(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Pop:
                Pop(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4:
                Ldc_I4(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_0:
                Ldc_I4_0(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_1:
                Ldc_I4_1(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_2:
                Ldc_I4_2(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_3:
                Ldc_I4_3(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_4:
                Ldc_I4_4(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_5:
                Ldc_I4_5(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_7:
                Ldc_I4_7(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_8:
                Ldc_I4_8(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_M1:
                Ldc_I4_M1(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldc_I4_S:
                Ldc_I4_S(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldloc_S:
                Ldloc_S(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldloc_0:
                Ldloc_0(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldloc_1:
                Ldloc_1(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldloc_2:
                Ldloc_2(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldloc_3:
                Ldloc_3(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Stloc_S:
                Stloc(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Stloc_0:
                Stloc_0(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Stloc_1:
                Stloc_1(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Stloc_2:
                Stloc_2(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Stloc_3:
                Stloc_3(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Br_S:
                return(Br_S(instruction, vCLRExecContext));

            case EnumOpCode.Blt_S:
                return(Blt_S(instruction, vCLRExecContext));

            case EnumOpCode.Clt:
                Clt(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Cgt:
                Cgt(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ceq:
                Ceq(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Br:
                return(Br(instruction, vCLRExecContext));

                break;

            case EnumOpCode.Brtrue_S:
                return(Brtrue_S(instruction, vCLRExecContext));

            case EnumOpCode.Ldstr:
                Ldstr(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Add:
                Add(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Call:
                Call(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Callvirt:
                Callvirt(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldarg_0:
                Ldarg_0(instruction, vCLRExecContext, callerContext);
                break;

            case EnumOpCode.Ldarg_1:
                Ldarg_1(instruction, vCLRExecContext, callerContext);
                break;

            case EnumOpCode.Ldarg_2:
                Ldarg_2(instruction, vCLRExecContext, callerContext);
                break;

            case EnumOpCode.Ldarg_3:
                Ldarg_3(instruction, vCLRExecContext, callerContext);
                break;

            case EnumOpCode.Box:
                Box(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Stfld:
                Stfld(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Newobj:
                Newobj(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Dup:
                Dup(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Newarr:
                Newarr(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Stelem_Ref:
                Stelem_Ref(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Brtrue:
                return(Brtrue(instruction, vCLRExecContext));

                break;

            case EnumOpCode.Leave_S:
                return(Leave_S(instruction, vCLRExecContext));

                break;

            case EnumOpCode.Ldlen:
                Ldlen(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Conv_I4:
                Conv_I4(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldelem_Ref:
                Ldelem_Ref(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Brfalse_S:
                return(Brfalse_S(instruction, vCLRExecContext));

                break;

            case EnumOpCode.Ldsfld:
                Ldsfld(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldsflda:
                Ldsflda(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldnull:
                Ldnull(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldftn:
                Ldftn(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Stsfld:
                Stsfld(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ldfld:
                Ldfld(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Volatile:
                Volatile(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Mkrefany:
                Mkrefany(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Throw:
                Throw(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Bne_Un_S:
                return(Bne_Un_S(instruction, vCLRExecContext));

            case EnumOpCode.Ldloca_S:
                Ldloca_S(instruction, vCLRExecContext);
                break;

            case EnumOpCode.Ble_S:
                return(Ble_S(instruction, vCLRExecContext));

            case EnumOpCode.Conv_I8:
                Conv_I8(instruction, vCLRExecContext);
                break;

            default:
                throw new NotImplementedException(string.Format("OpCode {0} - Not Implemented\r\nDescription: {1}", instruction.OpCodeInfo.Name, OpCodeDescriber.Describe(instruction.OpCode)));
            }

            return(null);
        }