private IProjectManager CreateProjectManager(Project project) { // Create the project system IProjectSystem projectSystem = VsProjectSystemFactory.CreateProjectSystem(project, _fileSystemProvider); #if VS14 if (projectSystem is INuGetPackageManager) { var nugetAwareRepo = new NuGetAwareProjectPackageRepository((INuGetPackageManager)projectSystem, _sharedRepository); return new ProjectManager(this, PathResolver, projectSystem, nugetAwareRepo); } #endif PackageReferenceRepository repository = new PackageReferenceRepository(projectSystem, project.GetProperName(), _sharedRepository); // Ensure the logger is null while registering the repository FileSystem.Logger = null; Logger = null; // Ensure that this repository is registered with the shared repository if it needs to be if (repository != null) { repository.RegisterIfNecessary(); } var projectManager = new VsProjectManager(this, PathResolver, projectSystem, repository); // The package reference repository also provides constraints for packages (via the allowedVersions attribute) projectManager.ConstraintProvider = repository; return projectManager; }
private static IEnumerable <AssemblyBinding> AddBindingRedirects( Project project, IFileSystemProvider fileSystemProvider, AppDomain domain, IDictionary <string, HashSet <string> > projectAssembliesCache, IVsFrameworkMultiTargeting frameworkMultiTargeting) { var redirects = Enumerable.Empty <AssemblyBinding>(); // Create a project system IFileSystem fileSystem = VsProjectSystemFactory.CreateProjectSystem(project, fileSystemProvider); // Run this on the UI thread since it enumerates all references IEnumerable <string> assemblies = ThreadHelper.Generic.Invoke(() => project.GetAssemblyClosure(fileSystemProvider, projectAssembliesCache)); redirects = BindingRedirectResolver.GetBindingRedirects(assemblies, domain); if (frameworkMultiTargeting != null) { // filter out assemblies that already exist in the target framework (CodePlex issue #3072) FrameworkName targetFrameworkName = project.GetTargetFrameworkName(); redirects = redirects.Where(p => !FrameworkAssemblyResolver.IsHigherAssemblyVersionInFramework(p.Name, p.AssemblyNewVersion, targetFrameworkName, fileSystemProvider)); } // Create a binding redirect manager over the configuration var manager = new BindingRedirectManager(fileSystem, project.GetConfigurationFile()); // Add the redirects manager.AddBindingRedirects(redirects); return(redirects); }
/// <summary> /// Copies the native binaries to the project's bin folder. /// </summary> /// <param name="project">The project.</param> /// <param name="packagesFileSystem">The packages file system.</param> /// <param name="packageNames">The package names.</param> public void CopyNativeBinaries(Project project, IFileSystem packagesFileSystem, IEnumerable <PackageName> packageNames) { if (project == null) { throw new ArgumentNullException("project"); } if (packagesFileSystem == null) { throw new ArgumentNullException("packagesFileSystem"); } if (packageNames.IsEmpty()) { return; } IProjectSystem projectSystem = _projectSystemFactory != null?_projectSystemFactory.CreateProjectSystem(project, _fileSystemProvider) : VsProjectSystemFactory.CreateProjectSystem(project, _fileSystemProvider); foreach (PackageName packageName in packageNames) { CopyNativeBinaries(projectSystem, packagesFileSystem, packageName); } }
private IProjectManager CreateProjectManager(Project project) { // Create the projet system IProjectSystem projectSystem = VsProjectSystemFactory.CreateProjectSystem(project); var repository = new PackageReferenceRepository(projectSystem, _sharedRepository); // Ensure the logger is null while registering the repository FileSystem.Logger = null; Logger = null; // Ensure that this repository is registered with the shared repository if it needs to be repository.RegisterIfNecessary(); // Create the project manager with the shared repository return(new ProjectManager(_sharedRepository, PathResolver, projectSystem, repository)); }
/// <summary> /// Adds refresh files to the specified project for all assemblies references belonging to the packages specified by packageNames. /// </summary> /// <param name="project">The project.</param> /// <param name="packagesFileSystem">The file system pointing to 'packages' folder under the solution.</param> /// <param name="packageNames">The package names.</param> public void AddRefreshFilesForReferences(Project project, IFileSystem packagesFileSystem, IEnumerable <PackageName> packageNames) { if (project == null) { throw new ArgumentNullException("project"); } if (packagesFileSystem == null) { throw new ArgumentNullException("packagesFileSystem"); } if (packageNames.IsEmpty()) { return; } FrameworkName projectTargetFramework = GetTargetFramework(project); var projectSystem = _projectSystemFactory != null?_projectSystemFactory.CreateProjectSystem(project, _fileSystemProvider) : VsProjectSystemFactory.CreateProjectSystem(project, _fileSystemProvider); foreach (PackageName packageName in packageNames) { string packageDirectory; IEnumerable <IPackageAssemblyReference> assemblyReferences = GetAssemblyReferences( packagesFileSystem, packageName.Id, packageName.Version, out packageDirectory); // get compatible assembly references for the current project's target framework IEnumerable <IPackageAssemblyReference> compatibleAssemblyReferences; if (VersionUtility.TryGetCompatibleItems(projectTargetFramework, assemblyReferences, out compatibleAssemblyReferences)) { foreach (var assemblyReference in compatibleAssemblyReferences) { // Get the absolute path to the assembly being added. string assemblyPath = Path.Combine(packageDirectory, assemblyReference.Path); // create one refresh file for each assembly reference, as per required by Website projects projectSystem.CreateRefreshFile(assemblyPath); } } } }
private static IEnumerable <AssemblyBinding> AddBindingRedirects(Project project, IFileSystemProvider fileSystemProvider, AppDomain domain, IDictionary <string, HashSet <string> > projectAssembliesCache, bool checkProjectType = true) { var redirects = Enumerable.Empty <AssemblyBinding>(); // Only add binding redirects to projects that aren't class libraries if (!checkProjectType || project.SupportsConfig()) { // Create a project system IFileSystem fileSystem = VsProjectSystemFactory.CreateProjectSystem(project, fileSystemProvider); // Run this on the UI thread since it enumerates all references IEnumerable <string> assemblies = ThreadHelper.Generic.Invoke(() => project.GetAssemblyClosure(fileSystemProvider, projectAssembliesCache)); redirects = BindingRedirectResolver.GetBindingRedirects(assemblies, domain); // Create a binding redirect manager over the configuration var manager = new BindingRedirectManager(fileSystem, project.GetConfigurationFile()); // Add the redirects manager.AddBindingRedirects(redirects); } return(redirects); }
private IProjectManager CreateProjectManager(Project project) { // Create the project system IProjectSystem projectSystem = VsProjectSystemFactory.CreateProjectSystem(project, _fileSystemProvider); var repository = new PackageReferenceRepository(projectSystem, _sharedRepository); // Ensure the logger is null while registering the repository FileSystem.Logger = null; Logger = null; // Ensure that this repository is registered with the shared repository if it needs to be repository.RegisterIfNecessary(); // The source repository of the project is an aggregate since it might need to look for all // available packages to perform updates on dependent packages var sourceRepository = CreateProjectManagerSourceRepository(); var projectManager = new ProjectManager(sourceRepository, PathResolver, projectSystem, repository); // The package reference repository also provides constraints for packages (via the allowedVersions attribute) projectManager.ConstraintProvider = repository; return(projectManager); }