Пример #1
0
        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);
        }
Пример #2
0
        public static ConstructorInfo GetConstructorInfo(params object[] argsForConstructor)
        {
            var typeArguments = argsForConstructor?.Select(a => a.GetType()).ToArray() ?? Array.Empty <Type>();

            return(FuncConstructorGenerator.GetConstructorInfo(typeArguments));
        }