private async Task CallGenerateCodes(MSBuildWorkspace workspace, Project beingCompiledProject, string solutionFullName) { Stopwatch sw = null; try { sw = Stopwatch.StartNew(); workspace.WorkspaceFailed += MSBuildWorkspace_WorkspaceFailed; workspace.SkipUnrecognizedProjects = workspace.LoadMetadataForReferencedProjects = true; IReadOnlyList <ProjectInSolution> allProjects = SolutionFile.Parse(solutionFullName).ProjectsInOrder; BitSourceGeneratorBitConfigProvider bitConfigProvider = new BitSourceGeneratorBitConfigProvider(solutionFullName); foreach (BitCodeGeneratorMapping mapping in bitConfigProvider.GetConfiguration(workspace).BitCodeGeneratorConfigs.BitCodeGeneratorMappings.Where(config => config.SourceProjects.Any(sp => sp.Name == beingCompiledProject.Name))) { foreach (BitTools.Core.Model.ProjectInfo proj in mapping.SourceProjects) { if (workspace.CurrentSolution.Projects.Any(p => p.Name == proj.Name)) { continue; /*It's already loaded*/ } await workspace.OpenProjectAsync(allProjects.Single(p => p.ProjectName == proj.Name).AbsolutePath); } } IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider(); IProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(controllersProvider); DefaultTypeScriptClientProxyGenerator generator = new DefaultTypeScriptClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(), bitConfigProvider, dtosProvider , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider)); await generator.GenerateCodes(workspace); Log($"Code Generation Completed in {sw.ElapsedMilliseconds} ms using {workspace.GetType().Name}."); } catch (Exception ex) { LogException("Code Generation failed.", ex); throw; } finally { sw?.Stop(); workspace.WorkspaceFailed -= MSBuildWorkspace_WorkspaceFailed; } }