示例#1
0
        public void GenerateStubTestStaticMethod()
        {
            var methodInfo = typeof(ExampleClass).GetMethod(nameof(ExampleClass.StaticTestMethod), BindingFlags.Public | BindingFlags.Static);
            var stub       = StubGenerator.GenerateStubForMethod(methodInfo);

            var result = (int)stub.Invoke(null, new object[] { 3, new ShimContext() });

            Assert.Equal(6, result);
        }
示例#2
0
        public void GenerateStubTestInstanceMethod()
        {
            var methodInfo = typeof(ExampleClass).GetMethod(nameof(ExampleClass.InstanceTestMethod), BindingFlags.Public | BindingFlags.Instance);
            var stub       = StubGenerator.GenerateStubForMethod(methodInfo);

            //This is not possible with the current generator
            //var result = (int)stub.Invoke(new TestClass(2), new object[] { 3, new ShimContext() });

            var result = (int)stub.Invoke(null, new object[] { new ExampleClass(2), 3, new ShimContext() });

            Assert.Equal(6, result);
        }
示例#3
0
        public void GenerateStubTestLocalMethod()
        {
            int TestMethod(int a)
            {
                return(a * 2);
            }

            Func <int, int> func = TestMethod;
            var             stub = StubGenerator.GenerateStubForMethod(func.Method);

            var result = (int)stub.Invoke(null, new[] { func.Target, 3, new ShimContext() });

            Assert.Equal(6, result);
        }
示例#4
0
        private static void EmitILForMethod(ILGenerator ilGenerator, OperandInstruction <MethodBase> instruction, MethodInfo methodInfo, ShimContext context, int contextParamIndex)
        {
            /*if (context.StubCache.TryGetValue(methodInfo, out DynamicMethod stub))
             * {
             *  ilGenerator.Emit(OpCodes.Ldtoken, methodInfo);
             *  ilGenerator.Emit(OpCodes.Ldtoken, methodInfo.DeclaringType);
             *  ilGenerator.Emit(OpCodes.Call, stub);
             *  return;
             * }*/

            var methodBody = methodInfo.GetMethodBody();

            if (methodBody == null)
            {
                ilGenerator.Emit(instruction.OpCode, methodInfo);
                return;
            }

            MethodInfo stub;

            if (instruction.OpCode == OpCodes.Call)
            {
                stub = StubGenerator.GenerateStubForMethod(methodInfo);
            }
            else if (instruction.OpCode == OpCodes.Callvirt)
            {
                stub = StubGenerator.GenerateStubForVirtualMethod(methodInfo);
            }

            /*else if (instruction.OpCode == OpCodes.Ldftn)
             * {
             *  stub = StubGenerator.GenerateStubForMethodPointer(methodInfo);
             * }
             * else if (instruction.OpCode == OpCodes.Ldvirtftn)
             * {
             *  stub = StubGenerator.GenerateStubForMethodPointer(methodInfo);
             * }*/
            else
            {
                ilGenerator.Emit(instruction.OpCode, methodInfo);
                return;
            }

            ilGenerator.Emit(OpCodes.Ldarg, contextParamIndex);
            ilGenerator.Emit(OpCodes.Call, stub);
            //PoseContext.StubCache.TryAdd(methodInfo, stub);
        }