Пример #1
0
        /// <summary>Returns the methods unmodified list of code instructions</summary>
        /// <param name="original">The original method/constructor</param>
        /// <param name="generator">A new generator that now contains all local variables and labels contained in the result</param>
        /// <returns>A list containing all the original <see cref="CodeInstruction"/></returns>
        ///
        public static List <CodeInstruction> GetOriginalInstructions(MethodBase original, out ILGenerator generator)
        {
            generator = CreateILGenerator();
            var reader = MethodBodyReader.GetInstructions(generator, original);

            return(reader.Select(ins => ins.GetCodeInstruction()).ToList());
        }
Пример #2
0
        /// <summary>A low level way to read the body of a method. Used for quick searching in methods</summary>
        /// <param name="method">The original method</param>
        /// <returns>All instructions as opcode/operand pairs</returns>
        ///
        public static IEnumerable <KeyValuePair <OpCode, object> > ReadMethodBody(MethodBase method)
        {
            var dummyMethod = new DynamicMethodDefinition($"{method.Name}_Dummy{Guid.NewGuid()}", typeof(void), new Type[0]);

            return(MethodBodyReader.GetInstructions(dummyMethod.GetILGenerator(), method)
                   .Select(instr => new KeyValuePair <OpCode, object>(instr.opcode, instr.operand)));
        }
Пример #3
0
        /// <summary>Returns the methods unmodified list of CodeInstructions</summary>
        /// <param name="original">The original method</param>
        /// <param name="generator">The generator that now contains all local variables and labels contained in the result</param>
        /// <returns>A list containing all the original CodeInstructions</returns>
        public static List <CodeInstruction> GetOriginalInstructions(MethodBase original, out ILGenerator generator)
        {
            var patch = DynamicTools.CreateDynamicMethod(original, $"_Copy{Guid.NewGuid()}");

            generator = patch.GetILGenerator();
            var reader = MethodBodyReader.GetInstructions(generator, original);

            return(reader.Select(ins => ins.GetCodeInstruction()).ToList());
        }
Пример #4
0
        /// <summary>Returns the methods unmodified list of code instructions</summary>
        /// <param name="original">The original method/constructor</param>
        /// <param name="generator">A new generator that now contains all local variables and labels contained in the result</param>
        /// <returns>A list containing all the original <see cref="CodeInstruction"/></returns>
        ///
        public static List <CodeInstruction> GetOriginalInstructions(MethodBase original, out ILGenerator generator)
        {
            var method = new DynamicMethodDefinition($"{original.Name}_Dummy{Guid.NewGuid()}", typeof(void), new Type[0]);

            generator = method.GetILGenerator();
            var reader = MethodBodyReader.GetInstructions(generator, original);

            return(reader.Select(ins => ins.GetCodeInstruction()).ToList());
        }
Пример #5
0
        /// <summary>Returns the methods unmodified list of CodeInstructions</summary>
        /// <param name="original">The original method</param>
        /// <param name="generator">Optionally an existing generator that will be used to create all local variables and labels contained in the result (if not specified, an internal generator is used)</param>
        /// <returns>A list containing all the original CodeInstructions</returns>
        public static List <CodeInstruction> GetOriginalInstructions(MethodBase original, ILGenerator generator = null)
        {
            var patch = MethodPatcher.CreateDynamicMethod(original, $"_Copy{Guid.NewGuid()}", Harmony.DEBUG);

            generator = generator ?? patch.GetILGenerator();
            var reader = MethodBodyReader.GetInstructions(generator, original);

            return(reader.Select(ins => ins.GetCodeInstruction()).ToList());
        }
Пример #6
0
 /// <summary>A low level way to read the body of a method. Used for quick searching in methods</summary>
 /// <param name="method">The original method</param>
 /// <param name="generator">An existing generator that will be used to create all local variables and labels contained in the result</param>
 /// <returns>All instructions as opcode/operand pairs</returns>
 ///
 public static IEnumerable <KeyValuePair <OpCode, object> > ReadMethodBody(MethodBase method, ILGenerator generator)
 {
     return(MethodBodyReader.GetInstructions(generator, method)
            .Select(instr => new KeyValuePair <OpCode, object>(instr.opcode, instr.operand)));
 }
Пример #7
0
 /// <summary>Gets all instructions from a method</summary>
 /// <param name="generator">The generator (for defining labels)</param>
 /// <param name="method">The original method</param>
 /// <returns>The instructions</returns>
 ///
 public static List <ILInstruction> GetInstructions(ILGenerator generator, MethodBase method)
 {
     return(MethodBodyReader.GetInstructions(generator, method));
 }