public void GenerateStubTestVirtualMethod() { var methodInfo = typeof(ExampleClass).GetMethod(nameof(ExampleClass.VirtualTestMethod), BindingFlags.Public | BindingFlags.Instance); var stub = StubGenerator.GenerateStubForVirtualMethod(methodInfo); var result = (int)stub.Invoke(null, new object[] { new ExampleClassChild(2), 3, new ShimContext() }); Assert.Equal(12, result); }
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); }