private void Obfuscate(ILInstruction instruction)
        {
            if (instruction.OpCode != OpCodes.Ldstr)
            {
                return;
            }

            int index = AddString((string)instruction.Value);

            instruction.OpCode = OpCodes.Ldsfld;
            instruction.Value  = _stringFieldRef;

            var next = new ILInstruction(Instruction.GetLdc(index));

            instruction.AddNext(next);
            instruction = next;

            next = new ILInstruction(OpCodes.Ldelem_Ref);
            instruction.AddNext(next);
        }
        private bool Build(ILInstruction instruction)
        {
            var methodRef = instruction.Value as MethodReference;

            if (methodRef == null)
            {
                return(false);
            }

            var opCode = instruction.OpCode;

            if (opCode != OpCodes.Call && opCode != OpCodes.Callvirt)
            {
                return(false);
            }

            if (methodRef.HasThis ||
                methodRef.CallConv != MethodCallingConvention.Default)
            {
                return(false);
            }

            int methodIndex;

            _methodRefs.TryAdd(methodRef, out methodIndex);

            instruction.OpCode = OpCodes.Ldsfld;
            instruction.Value  =
                new FieldReference(
                    "MethodPointers",
                    new ArrayType(
                        TypeReference.GetPrimitiveType(PrimitiveTypeCode.IntPtr, _module.Assembly)),
                    new TypeReference(_mainType.Name, _mainType.Namespace, false));
            instruction = instruction.AddNext(Instruction.GetLdc(methodIndex));
            instruction = instruction.AddNext(OpCodes.Ldelem_I);
            instruction = instruction.AddNext(OpCodes.Calli, methodRef.CallSite);

            return(true);
        }