public override TaskResult Start(TaskExecutionNode node)
        {
            var task = (RunAssemblyTask)node.RemoteTask;

            _contextAssembly = LoadContextAssembly(task);
            if (_contextAssembly == null)
            {
                return(TaskResult.Error);
            }

            var result = VersionCompatibilityChecker.Check(_contextAssembly);

            if (!result.Success)
            {
                Server.TaskExplain(task, result.Explanation);
                Server.TaskError(task, result.ErrorMessage);

                return(TaskResult.Error);
            }

            _listener = new PerAssemblyRunListener(Server, task);

            _runner   = new DefaultRunner(_listener, RunOptions.Default);
            _runScope = GetRunScope(_runner);

            return(TaskResult.Success);
        }
        public override void ExecuteRecursive(TaskExecutionNode node)
        {
            var task = (RunAssemblyTask)node.RemoteTask;

            var contextAssembly = LoadContextAssembly(task);

            if (contextAssembly == null)
            {
                return;
            }

            var result = VersionCompatibilityChecker.Check(contextAssembly);

            if (!result.Success)
            {
                Server.TaskException(node.RemoteTask, new[] { new TaskException("no type", result.ErrorMessage, null) });

                return;
            }

            var listener = new PerAssemblyRunListener(Server, task);
            var runner   = new AppDomainRunner(listener, RunOptions.Default);
            var runScope = GetRunScope(runner);

            node.Flatten(x => x.Children).Each(children => RegisterRemoteTaskNotifications(listener, children));

            try
            {
                runScope.StartRun(contextAssembly);

                foreach (var child in node.Children)
                {
                    RunContext(runner, contextAssembly, child);
                }
            }
            finally
            {
                runScope.EndRun(contextAssembly);
            }
        }
        public override TaskResult Start(TaskExecutionNode node)
        {
            var task = (ContextTask)node.RemoteTask;

            _contextAssembly = LoadContextAssembly(task);
            if (_contextAssembly == null)
            {
                return(TaskResult.Error);
            }

            var result = VersionCompatibilityChecker.Check(_contextAssembly);

            if (!result.Success)
            {
                Server.TaskExplain(task, result.Explanation);
                Server.TaskError(task, result.ErrorMessage);

                return(TaskResult.Error);
            }

            _contextClass = _contextAssembly.GetType(task.ContextTypeName);
            if (_contextClass == null)
            {
                Server.TaskExplain(task,
                                   String.Format("Could not load type '{0}' from assembly {1}.",
                                                 task.ContextTypeName,
                                                 task.AssemblyLocation));
                Server.TaskError(node.RemoteTask, "Could not load context");
                return(TaskResult.Error);
            }

            _listener = new PerContextRunListener(Server, node.RemoteTask);
            _runner   = new DefaultRunner(_listener, RunOptions.Default);

            return(TaskResult.Success);
        }