public ILibraryExport GetLibraryExport(ILibraryKey target) { Project project; // Can't find a project file with the name so bail if (!_projectResolver.TryResolveProject(target.Name, out project)) { return(null); } Logger.TraceInformation("[{0}]: GetLibraryExport({1}, {2}, {3}, {4})", GetType().Name, target.Name, target.TargetFramework, target.Configuration, target.Aspect); var targetFrameworkInformation = project.GetTargetFramework(target.TargetFramework); // This is the target framework defined in the project. If there were no target frameworks // defined then this is the targetFramework specified if (targetFrameworkInformation.FrameworkName != null) { target = target.ChangeTargetFramework(targetFrameworkInformation.FrameworkName); } var key = Tuple.Create( target.Name, target.TargetFramework, target.Configuration, target.Aspect); var cache = (ICache)_serviceProvider.GetService(typeof(ICache)); return(cache.Get <ILibraryExport>(key, ctx => { // Get the composite library export provider var exportProvider = (ILibraryExportProvider)_serviceProvider.GetService(typeof(ILibraryExportProvider)); var libraryManager = (ILibraryManager)_serviceProvider.GetService(typeof(ILibraryManager)); var metadataReferences = new List <IMetadataReference>(); var sourceReferences = new List <ISourceReference>(); if (!string.IsNullOrEmpty(targetFrameworkInformation.AssemblyPath)) { var assemblyPath = ResolvePath(project, target.Configuration, targetFrameworkInformation.AssemblyPath); var pdbPath = ResolvePath(project, target.Configuration, targetFrameworkInformation.PdbPath); metadataReferences.Add(new CompiledProjectMetadataReference(project, assemblyPath, pdbPath)); } else { var provider = project.LanguageServices?.ProjectReferenceProvider ?? Project.DefaultLanguageService; // Find the default project exporter var projectReferenceProvider = _projectReferenceProviders.GetOrAdd(provider, typeInfo => { return LanguageServices.CreateService <IProjectReferenceProvider>(_serviceProvider, _projectLoadContext.Value, typeInfo); }); Logger.TraceInformation("[{0}]: GetProjectReference({1}, {2}, {3}, {4})", provider.TypeName, target.Name, target.TargetFramework, target.Configuration, target.Aspect); // Get the exports for the project dependencies var projectExport = new Lazy <ILibraryExport>(() => ProjectExportProviderHelper.GetExportsRecursive( cache, libraryManager, exportProvider, target, dependenciesOnly: true)); // Resolve the project export IMetadataProjectReference projectReference = projectReferenceProvider.GetProjectReference( project, target, () => projectExport.Value); metadataReferences.Add(projectReference); // Shared sources foreach (var sharedFile in project.Files.SharedFiles) { sourceReferences.Add(new SourceFileReference(sharedFile)); } } return new LibraryExport(metadataReferences, sourceReferences); })); }
public ILibraryExport GetLibraryExport(string name, FrameworkName targetFramework, string configuration) { Project project; // Can't find a project file with the name so bail if (!_projectResolver.TryResolveProject(name, out project)) { return(null); } Trace.TraceInformation("[{0}]: GetLibraryExport({1}, {2}, {3})", GetType().Name, name, targetFramework, configuration); var targetFrameworkInformation = project.GetTargetFramework(targetFramework); // This is the target framework defined in the project. If there were no target frameworks // defined then this is the targetFramework specified targetFramework = targetFrameworkInformation.FrameworkName ?? targetFramework; var cacheKey = Tuple.Create(name, targetFramework, configuration); return(_exportCache.GetOrAdd(cacheKey, _ => { // Get the composite library export provider var exportProvider = (ILibraryExportProvider)_serviceProvider.GetService(typeof(ILibraryExportProvider)); var libraryManager = (ILibraryManager)_serviceProvider.GetService(typeof(ILibraryManager)); // Get the exports for the project dependencies ILibraryExport projectExport = ProjectExportProviderHelper.GetExportsRecursive( libraryManager, exportProvider, project.Name, targetFramework, configuration, dependenciesOnly: true); var metadataReferences = new List <IMetadataReference>(); var sourceReferences = new List <ISourceReference>(); if (!string.IsNullOrEmpty(targetFrameworkInformation.AssemblyPath)) { var assemblyPath = ResolvePath(project, configuration, targetFrameworkInformation.AssemblyPath); var pdbPath = ResolvePath(project, configuration, targetFrameworkInformation.PdbPath); metadataReferences.Add(new CompiledProjectMetadataReference(project, assemblyPath, pdbPath)); } else { // Find the default project exporter var projectReferenceProvider = _projectReferenceProviders.GetOrAdd(project.LanguageServices.ProjectReferenceProvider, typeInfo => { return LanguageServices.CreateService <IProjectReferenceProvider>(_serviceProvider, typeInfo); }); Trace.TraceInformation("[{0}]: GetProjectReference({1}, {2}, {3})", project.LanguageServices.ProjectReferenceProvider.TypeName, name, targetFramework, configuration); // Resolve the project export IMetadataProjectReference projectReference = projectReferenceProvider.GetProjectReference( project, targetFramework, configuration, projectExport.MetadataReferences, projectExport.SourceReferences, metadataReferences); metadataReferences.Add(projectReference); // Shared sources foreach (var sharedFile in project.SharedFiles) { sourceReferences.Add(new SourceFileReference(sharedFile)); } } return new LibraryExport(metadataReferences, sourceReferences); })); }