private LibraryExport ExportProject(ProjectDescription project, string aspect) { Logger.TraceInformation($"[{nameof(LibraryExporter)}]: {nameof(ExportProject)}({project.Identity.Name}, {aspect}, {project.Framework}, {_configuration})"); var key = Tuple.Create(project.Identity.Name, project.Framework, _configuration, aspect); return(_compilationEngine.CompilationCache.Cache.Get <ProjectExportContext>(key, ctx => { var metadataReferences = new List <IMetadataReference>(); var sourceReferences = new List <ISourceReference>(); var context = new ProjectExportContext(); // Create the compilation context var compilationContext = project.Project.ToCompilationContext(project.Framework, _configuration, aspect); if (!string.IsNullOrEmpty(project.TargetFrameworkInfo?.AssemblyPath)) { // Project specifies a pre-compiled binary. We're done! var assemblyPath = ResolvePath(project.Project, _configuration, project.TargetFrameworkInfo.AssemblyPath); var pdbPath = ResolvePath(project.Project, _configuration, project.TargetFrameworkInfo.PdbPath); metadataReferences.Add(new CompiledProjectMetadataReference(compilationContext, assemblyPath, pdbPath)); } else { // We need to compile the project. var compilerTypeInfo = project.Project.CompilerServices?.ProjectCompiler ?? Project.DefaultCompiler; // Create the project exporter var exporter = _compilationEngine.CreateProjectExporter(project.Project, project.Framework, _configuration); context.LoadContext = _compilationEngine.CreateBuildLoadContext(project.Project, _configuration); // Get the exports for the project dependencies var projectDependenciesExport = new Lazy <LibraryExport>(() => exporter.GetAllDependencies(project.Identity.Name, aspect)); // Find the project compiler var projectCompiler = _compilationEngine.GetCompiler(compilerTypeInfo, context.LoadContext); Logger.TraceInformation($"[{nameof(LibraryExporter)}]: GetProjectReference({compilerTypeInfo.TypeName}, {project.Identity.Name}, {project.Framework}, {aspect})"); // Resolve the project export IMetadataProjectReference projectReference = projectCompiler.CompileProject( compilationContext, () => projectDependenciesExport.Value, () => CompositeResourceProvider.Default.GetResources(project.Project), _configuration); metadataReferences.Add(projectReference); // Shared sources foreach (var sharedFile in project.Project.Files.SharedFiles) { sourceReferences.Add(new SourceFileReference(sharedFile)); } } context.Export = new LibraryExport(metadataReferences, sourceReferences); return context; }).Export); }
private LibraryExport ExportProject(ProjectDescription project, string aspect) { Logger.TraceInformation($"[{nameof(LibraryExporter)}]: {nameof(ExportProject)}({project.Identity.Name}, {aspect}, {project.Framework}, {_configuration})"); var key = Tuple.Create(project.Identity.Name, project.Framework, _configuration, aspect); return _compilationEngine.CompilationCache.Cache.Get<ProjectExportContext>(key, ctx => { var metadataReferences = new List<IMetadataReference>(); var sourceReferences = new List<ISourceReference>(); var context = new ProjectExportContext(); // Create the compilation context var compilationContext = project.Project.ToCompilationContext(project.Framework, _configuration, aspect); if (!string.IsNullOrEmpty(project.TargetFrameworkInfo?.AssemblyPath)) { // Project specifies a pre-compiled binary. We're done! var assemblyPath = ResolvePath(project.Project, _configuration, project.TargetFrameworkInfo.AssemblyPath); var pdbPath = ResolvePath(project.Project, _configuration, project.TargetFrameworkInfo.PdbPath); metadataReferences.Add(new CompiledProjectMetadataReference(compilationContext, assemblyPath, pdbPath)); } else { // We need to compile the project. var compilerTypeInfo = project.Project.CompilerServices?.ProjectCompiler ?? Project.DefaultCompiler; // Create the project exporter var exporter = _compilationEngine.CreateProjectExporter(project.Project, project.Framework, _configuration); context.LoadContext = _compilationEngine.CreateBuildLoadContext(project.Project, _configuration); // Get the exports for the project dependencies var projectDependenciesExport = new Lazy<LibraryExport>(() => exporter.GetAllDependencies(project.Identity.Name, aspect)); // Find the project compiler var projectCompiler = _compilationEngine.GetCompiler(compilerTypeInfo, context.LoadContext); Logger.TraceInformation($"[{nameof(LibraryExporter)}]: GetProjectReference({compilerTypeInfo.TypeName}, {project.Identity.Name}, {project.Framework}, {aspect})"); // Resolve the project export IMetadataProjectReference projectReference = projectCompiler.CompileProject( compilationContext, () => projectDependenciesExport.Value, () => CompositeResourceProvider.Default.GetResources(project.Project), _configuration); metadataReferences.Add(projectReference); // Shared sources foreach (var sharedFile in project.Project.Files.SharedFiles) { sourceReferences.Add(new SourceFileReference(sharedFile)); } } context.Export = new LibraryExport(metadataReferences, sourceReferences); return context; }).Export; }