public IEnumerable<WorkflowInfo> Find(LookupOptions options) { foreach (var assembly in GetAssemblies(options)) { foreach (var exportedType in assembly.GetExportedTypes()) { var workflowType = GetWorkflowTypeIfPossible(exportedType); if (workflowType != null) { LoadDllsFromAssemblyDirectory(assembly, options); yield return CreateWorkflowInfo(exportedType, workflowType); } } } }
private void LoadDllsFromAssemblyDirectory(Assembly assembly, LookupOptions options) { var directory = Path.GetDirectoryName(assembly.Location); // todo Check it!!! AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var assemblyFileName = string.Format("{0}.dll", args.Name.Substring(0, args.Name.IndexOf(",", StringComparison.InvariantCultureIgnoreCase))); var assemblyFullPath = Path.Combine(directory, assemblyFileName); if (File.Exists(assemblyFullPath)) { return Assembly.LoadFrom(assemblyFullPath); } return null; }; }
protected WorkflowInfo GetWorkflowInfo(RunningOptions options, IList<IWorkflowLookup> lookups, LogHelper log) { log.Info("Searching for workflows..."); var lookupOptions = new LookupOptions(options); foreach (var lookup in lookups) { if (lookup.CanHandle(lookupOptions)) { log.Info("using lookup {0} for workflow searching", lookup.GetType()); var foundWorkflows = lookup.Find(lookupOptions); return SelectDefaultWorkflow(foundWorkflows.ToList(), options, log); } } throw new Exception(string.Format("No lookup to handle input file: {0}", options.InputFile)); }
protected override IEnumerable<Assembly> GetAssemblies(LookupOptions options) { var buildWorkflow = new BuildWorkflowProjectWorkflow(options.RunningOptions); var executerTask = new SubflowTask<Nothing>(buildWorkflow, Identities.Empty); var taskContext = new TaskContext( new SequenceExecutionStrategy(), options.RunningOptions.LogRenderer, options.RunningOptions.WorkDirectory, new DefaultEnvironment(), interceptor: null); ITaskResult<Nothing> buildResult = executerTask.Execute(taskContext); if (buildResult.IsSuccess) { var projectName = options.RunningOptions.InputFile.NameWithoutExtension; IFile assemblyFile = options.RunningOptions.InputFile.Directory["bin"]["Debug"][projectName + ".dll"]; yield return Assembly.LoadFile(assemblyFile.AbsolutePath); } }
public override bool CanHandle(LookupOptions options) { return options.RunningOptions.InputFile.Extension.Is(".dll"); }
protected override IEnumerable<Assembly> GetAssemblies(LookupOptions options) { yield return Assembly.LoadFile(options.RunningOptions.InputFile.AbsolutePath); }
protected abstract IEnumerable<Assembly> GetAssemblies(LookupOptions options);
public abstract bool CanHandle(LookupOptions options);