protected void onProject(string project, ExecutionOrderType type, bool fSuccess = true) { lock (_plock) { var eop = new EOProject() { Project = project, Order = type }; int max = Cmd.Env.ProjectsDTE.Count(); var _projects = projects.Where(p => !ExecutionOrder.IsSpecial(p.Key)); int count = _projects.Count(); // 'First Project' & 'First Type' Before if (count < 1) { eop.aProject = ExecutionOrder.FIRST_PROJECT; eop.aType = ExecutionOrder.FIRST_TYPE; } // 'Last Project' & 'Last Type' Before else if (!projects.ContainsKey(project) && count + 1 == max) { eop.aProject = ExecutionOrder.LAST_PROJECT; eop.aType = ExecutionOrder.LAST_TYPE; } else { // 'First Project' After if (projects.ContainsKey(project) && projects[project].aProject == ExecutionOrder.FIRST_PROJECT) { eop.aProject = ExecutionOrder.FIRST_PROJECT; } // 'Last Project' After else if (projects.ContainsKey(project) && projects[project].aProject == ExecutionOrder.LAST_PROJECT) { eop.aProject = ExecutionOrder.LAST_PROJECT; } // 'First Type' After if (type == ExecutionOrderType.After && !projects.Any(p => p.Value.Order == ExecutionOrderType.After)) { eop.aType = ExecutionOrder.FIRST_TYPE; } // 'Last Type' After else if (type == ExecutionOrderType.After && count == max) { var list = _projects.Where(p => p.Value.Order == ExecutionOrderType.Before); if (list.Count() == 1 && list.FirstOrDefault().Key == project) { eop.aType = ExecutionOrder.LAST_TYPE; } } } projects[project] = eop; current.Project = project; current.Order = type; if (eop.aProject != null) { projects[eop.aProject] = eop; // alias to 'First/Last Project' } if (eop.aType != null) { projects[eop.aType] = eop; // alias to 'First/Last Type' } } Log.Trace($"onProject: '{project}'({projects[project].aProject}/{projects[project].aType}):{type} == {fSuccess}"); if (Status._.contains(SolutionEventType.Pre, StatusType.Deferred)) { monitoringPre(project, type, fSuccess); } }