private static string SetupDesc(SetupMethod setup) { if (setup == null) { return(string.Empty); } var name = setup.name; var returnType = setup.returnType; if (returnType == typeof(IEnumerator)) { return(@" yield return instance." + name + @"();"); } // ret type is void. return(@" try { instance." + name + @"(); } catch (Exception e) { rec.SetupFailed(e); throw; }"); }
public TestEntryClass(string className, MethodInfo setupMethod, MethodInfo teardownMethod, TestMethod[] methods) { this.className = className; if (setupMethod != null) { this.setupMethod = new SetupMethod(setupMethod.Name, setupMethod.ReturnType); } if (teardownMethod != null) { this.teardownMethod = new TeardownMethod(teardownMethod.Name, teardownMethod.ReturnType); } this.methods = methods; }
private MethodDefinition GenerateInitMethod(MethodDefinition configureMethod, FieldDefinition globalServiceProvider) { var initMethod = new MethodDefinition(nameof(DI.Init), MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Static, ModuleDefinition.ImportReference(typeof(void))); var configureAction = new ParameterDefinition("configure", ParameterAttributes.None, ModuleDefinition.Get <Action <IApplicationBuilder> >()); initMethod.Parameters.Add(configureAction); var applicationBuilder = new VariableDefinition(ModuleDefinition.Get <IApplicationBuilder>()); initMethod.Body.Variables.Add(applicationBuilder); ILProcessor initProcessor = initMethod.Body.GetILProcessor(); Instruction createApplicationbuilder = Instruction.Create(OpCodes.Newobj, ModuleDefinition.GetDefaultConstructor <ApplicationBuilder>()); initProcessor.Emit(OpCodes.Ldsfld, globalServiceProvider); initProcessor.Emit(OpCodes.Brfalse_S, createApplicationbuilder); //Compare initProcessor.Emit(OpCodes.Newobj, ModuleDefinition.GetConstructor <AlreadyInitializedException>()); initProcessor.Emit(OpCodes.Throw); initProcessor.Append(createApplicationbuilder); initProcessor.Emit(OpCodes.Stloc_0); initProcessor.Emit(OpCodes.Ldloc_0); //applicationBuilder initProcessor.Emit(OpCodes.Ldnull); initProcessor.Emit(OpCodes.Ldftn, configureMethod); initProcessor.Emit(OpCodes.Newobj, ModuleDefinition.GetConstructor <Action <IServiceCollection> >()); initProcessor.Emit(OpCodes.Callvirt, ModuleDefinition.GetMethod <IApplicationBuilder>(nameof(IApplicationBuilder.ConfigureServices))); initProcessor.Emit(OpCodes.Pop); MethodDefinition setupMethod = SetupMethod.Find(ModuleDefinition, Logger); if (setupMethod != null) { Logger.Debug($"Found setup method '{setupMethod.FullName}'", DebugLogLevel.Default); initProcessor.Emit(OpCodes.Ldloc_0); //applicationBuilder initProcessor.Emit(OpCodes.Call, setupMethod); initProcessor.Emit(OpCodes.Nop); } else { Logger.Debug("No setup method found", DebugLogLevel.Default); } Instruction loadForBuild = Instruction.Create(OpCodes.Ldloc_0); initProcessor.Emit(OpCodes.Ldarg_0); initProcessor.Emit(OpCodes.Brfalse_S, loadForBuild); initProcessor.Emit(OpCodes.Ldarg_0); initProcessor.Emit(OpCodes.Ldloc_0); initProcessor.Emit(OpCodes.Callvirt, ModuleDefinition.GetMethod <Action <IApplicationBuilder> >(nameof(Action <IApplicationBuilder> .Invoke))); initProcessor.Append(loadForBuild); var buildMethod = ModuleDefinition.GetMethod <IApplicationBuilder>(nameof(IApplicationBuilder.Build)); buildMethod.ReturnType = Import.IServiceProvider; //Must update the return type to handle .net core apps initProcessor.Emit(OpCodes.Callvirt, buildMethod); initProcessor.Emit(OpCodes.Stsfld, globalServiceProvider); initProcessor.Emit(OpCodes.Ldsfld, globalServiceProvider); initProcessor.Emit(OpCodes.Call, Import.GlobalDI_Register); initProcessor.Emit(OpCodes.Ret); return(initMethod); }
private MethodDefinition GenerateInitMethod(MethodDefinition configureMethod, FieldDefinition globalServiceProvider) { var initMethod = new MethodDefinition(AutoDI.Constants.InitMethodName, MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Static, ModuleDefinition.ImportReference(typeof(void))); var configureAction = new ParameterDefinition("configure", ParameterAttributes.None, Import.System.Action.Type.MakeGenericInstanceType(Import.AutoDI.IApplicationBuilder.Type)); initMethod.Parameters.Add(configureAction); var applicationBuilder = new VariableDefinition(Import.AutoDI.IApplicationBuilder.Type); initMethod.Body.Variables.Add(applicationBuilder); ILProcessor initProcessor = initMethod.Body.GetILProcessor(); Instruction createApplicationbuilder = Instruction.Create(OpCodes.Newobj, Import.AutoDI.ApplicationBuilder.Ctor); initProcessor.Emit(OpCodes.Ldsfld, globalServiceProvider); initProcessor.Emit(OpCodes.Brfalse_S, createApplicationbuilder); //Compare initProcessor.Emit(OpCodes.Newobj, Import.AutoDI.Exceptions.AlreadyInitializedException_Ctor); initProcessor.Emit(OpCodes.Throw); initProcessor.Append(createApplicationbuilder); initProcessor.Emit(OpCodes.Stloc_0); initProcessor.Emit(OpCodes.Ldloc_0); //applicationBuilder initProcessor.Emit(OpCodes.Ldnull); initProcessor.Emit(OpCodes.Ldftn, configureMethod); initProcessor.Emit(OpCodes.Newobj, ModuleDefinition.ImportReference(Import.System.Action.Ctor.MakeGenericDeclaringType(Import.DependencyInjection.IServiceCollection))); initProcessor.Emit(OpCodes.Callvirt, Import.AutoDI.IApplicationBuilder.ConfigureServices); initProcessor.Emit(OpCodes.Pop); MethodDefinition setupMethod = SetupMethod.Find(ModuleDefinition, Logger); if (setupMethod != null) { Logger.Debug($"Found setup method '{setupMethod.FullName}'", AutoDI.DebugLogLevel.Default); initProcessor.Emit(OpCodes.Ldloc_0); //applicationBuilder initProcessor.Emit(OpCodes.Call, setupMethod); initProcessor.Emit(OpCodes.Nop); } else { Logger.Debug("No setup method found", AutoDI.DebugLogLevel.Default); } Instruction loadForBuild = Instruction.Create(OpCodes.Ldloc_0); initProcessor.Emit(OpCodes.Ldarg_0); initProcessor.Emit(OpCodes.Brfalse_S, loadForBuild); initProcessor.Emit(OpCodes.Ldarg_0); initProcessor.Emit(OpCodes.Ldloc_0); initProcessor.Emit(OpCodes.Callvirt, ModuleDefinition.ImportReference(Import.System.Action.Invoke.MakeGenericDeclaringType(Import.AutoDI.IApplicationBuilder.Type))); initProcessor.Append(loadForBuild); initProcessor.Emit(OpCodes.Callvirt, Import.AutoDI.IApplicationBuilder.Build); initProcessor.Emit(OpCodes.Stsfld, globalServiceProvider); initProcessor.Emit(OpCodes.Ldsfld, globalServiceProvider); initProcessor.Emit(OpCodes.Call, Import.AutoDI.GlobalDI.Register); initProcessor.Emit(OpCodes.Ret); return(initMethod); }