private static MethodDefinition WrapperBody(MethodDefinition wrapper, MethodReference testWrapperConstructor, ILProcessor ilProcessor, ModuleDefinition module) { var funcTaskConstructor = module.ImportReference(FuncConstructorGenerator.GetConstructorInfo(null)); var testWrapperInvokeReference = module.ImportReference(typeof(XUnitTestWrapper).GetMethod("Invoke")); var runInCoyoteReference = module.ImportReference(typeof(XUnitTestTemplates).GetMethod("RunTestInCoyote")); var disposeReference = module.ImportReference(typeof(IDisposable).GetMethod("Dispose")); var lastRet = ilProcessor.Create(OpCodes.Ret); var leave_s = ilProcessor.Create(OpCodes.Leave_S, lastRet); var endFinally = ilProcessor.Create(OpCodes.Endfinally); var brfalse_s = ilProcessor.Create(OpCodes.Brfalse_S, endFinally); ilProcessor.Append(ilProcessor.Create(OpCodes.Newobj, testWrapperConstructor)); ilProcessor.Append(ilProcessor.Create(OpCodes.Stloc_0)); ilProcessor.Append(ilProcessor.Create(OpCodes.Ldloc_0)); var tryStart = ilProcessor.Body.Instructions.Last(); ilProcessor.Append(ilProcessor.Create(OpCodes.Ldftn, testWrapperInvokeReference)); ilProcessor.Append(ilProcessor.Create(OpCodes.Newobj, funcTaskConstructor)); ilProcessor.Append(ilProcessor.Create(OpCodes.Call, runInCoyoteReference)); ilProcessor.Append(leave_s); ilProcessor.Append(ilProcessor.Create(OpCodes.Ldloc_0)); var tryEnd = ilProcessor.Body.Instructions.Last(); ilProcessor.Append(brfalse_s); ilProcessor.Append(ilProcessor.Create(OpCodes.Ldloc_0)); ilProcessor.Append(ilProcessor.Create(OpCodes.Callvirt, disposeReference)); ilProcessor.Append(endFinally); ilProcessor.Append(lastRet); var handlerEnd = ilProcessor.Body.Instructions.Last(); var exceptionHandler = new ExceptionHandler(ExceptionHandlerType.Finally) { TryStart = tryStart, TryEnd = tryEnd, HandlerStart = tryEnd, HandlerEnd = handlerEnd }; wrapper.Body.ExceptionHandlers.Clear(); wrapper.Body.ExceptionHandlers.Add(exceptionHandler); return(wrapper); }
public static ConstructorInfo GetConstructorInfo(params object[] argsForConstructor) { var typeArguments = argsForConstructor?.Select(a => a.GetType()).ToArray() ?? Array.Empty <Type>(); return(FuncConstructorGenerator.GetConstructorInfo(typeArguments)); }